Decimal – 보다 정확한 소수점 산술

들어가기 전에 다음과 같은 코드를 보자. 흔히 하는 실수 중에 하나 인데 float 타입 값으로 반복횟수가 제한된 루프를 만드려고 시도하는 것이다.

a, b = 1, 0.1
while a != 0:
  print(a)
  a -= b

하지만 안타깝게도 이 코드는 의도대로 실행되지 않을 것이다. 왜냐하면 1.0 에서 0.1을 열 번 뺀다하더라도 0이 되지 않기 때문이다. 어째서? (실제로 파이썬 쉘에서 1.0 / 10 == 0.1 이고, 0.1 * 10 == 1 이다)

Decimal – 보다 정확한 소수점 산술 더보기

npm 모듈의 전역 설치 위치 변경

npm -g install 로 설치하는 npm 모듈들은 기본적으로 C:\Users\사용자\AppData\Roaming\npm\node_modules 아래에 설치된다. 용량은 그리 크지 않겠지만 괜히 여기에 뭐 설치되는게 싫어서 다른 곳으로 설치를 옮기고 싶다면?

npm 모듈의 전역 설치 위치 변경 더보기

Vim – 레지스터에 관해

vim에서 문자열을 복사하는 것을 매뉴얼에서는 copy가 아니라 yank로 설명한다. 이는 전통적인 이유가 있긴한데, 어쨌든 보통의 응용프로그램에서의 ‘복사’는 클립보드에 콘텐츠를 써 넣는 것을 의미한다. 하지만 vim은 항상 클립보드를 사용할 수 있는 것은 아니다. 대신에 ‘레지스터’라는 별도의 메모리 공간을 사용해서 텍스트를 따로 보관했다가 나중에 사용한다. 이는 sed의 홀드 영역과 비슷하다고 할 수 있다. 대신에 vim은 단순히 하나의 저장 영역을 사용하는 것이 아니라 매우 다양하고 많은 레지스터를 사용한다.

레지스터 사용방법

레지스터는 각각의 이름이 있고, 각 이름은 모두 키 하나에 맵핑되어 있다. 레지스터는 기본적으로 편집 명령을 통해서 쓰거나 읽을 수 있다. 복사(y)는 물론 삭제(d, x) 및 교체 (r, s)시에도 제거되는 내용은 즉시 폐기된다기 보다는 특정한 레지스터에 복사할 수 있다. 특정 레지스터에 복사된 내용을 p 등으로 붙여넣는 경우에 레지스터를 사용할 수 있다.

Vim – 레지스터에 관해 더보기

Swift 프로퍼티의 옵저버에 대한 규칙

  • lazy 프로퍼티는 옵저버를 가질 수 없다. (단 최초 액세스 이후 변경하는 것은 가능하다.)
  • computed 프로퍼티에 대해서는 옵저버를 설치하는 것이 의미가 없다. 단 상속받은 computed 프로퍼티에 대해서는 옵저버를 설치할 수 있다.
  • 옵저버는 해당 클래스의 지정 이니셜라이저 내에서 값을 변경하는 경우에는 호출되지 않는다.
  • 단, 상속받은 프로퍼티가 옵저버가 설치되어 있다면 부모의 지정 이니셜라이저 호출 후에 변경한다면, 부모의 옵저버가 호출될 것이다.
  • 비슷하게 편의 이니셜라이저에서는 지정 이니셜라이저를 통해 초기화한 후, 프로퍼티값을 다시 변경하면 옵저버가 실행된다.

lazy 프로퍼티와 옵저버

lazy 프로퍼티는 옵저버를 가질 수 없다. 위에서 설명한 옵저버와 관련된 규칙들을 살펴보면, 다음과 같은 가설을 세울 수 있다. 1) 옵저버는 객체 인스턴스의 초기화가 완료된 시점부터 작동한다. 2) 객체의 초기화는 지정 이니셜라이저가 실행을 완료한 시점으로 본다.

그런데 lazy 프로퍼티는 약간 예외적이다. 왜냐하면 지정이니셜라이저가 실행을 완료했다하더라도 느긋하게 초기화되는 프로퍼티는 아직 초기화 되기 전이기 때문이다. 따라서 위 가설에서 1번 항목에 따라 지정 이니셜라이저가 실행되었더라도 옵저버가 동작 가능한 시점이 결정되지 않는다. 아래는 이 부분이 언급된 공식 문서의 내용.


You can add property observers to any stored properties you define, except for lazy stored properties. You can also add property observers to any inherited property (whether stored or computed) by overriding the property within a subclass. You don’t need to define property observers for nonoverridden computed properties, because you can observe and respond to changes to their value in the computed property’s setter. Property overriding is described in Overriding.

상속된 계산 프로퍼티에는 옵저버 설치가 가능하다?

보통 옵저버는 저장 프로퍼티에 설치한다. 계산 프로퍼티의 경우에는 set 하는 과정 자체가 별도의 코드를 실행하는 것이므로 사실상 옵저버가 필요 없다. 하지만 이렇게 set이 가능한 계산 프로퍼티에 대해서 이를 상속받는 서브 클래스는 해당 프로퍼티를 오버라이드하여 didSet, willSet 옵저버만 추가하는 것이 가능하다. (당연히 setter를 오버라이드하는 경우에는 옵저버를 추가할 수 없다.)