한 점이 삼각형 내부에 있는지를 체크하기

평면좌표상의 임의의 점 P(px, py) 가 세 점 A(ax, ay), B(bx, by), C(cx, cy)로 이루어진 삼각형 내부에 있는지 외부에 있는지를 판단하는 코드를 작성해보자. 이거 마치 무슨 고등학교 수학문제 같은데, 사실 고등학교 수학 문제 맞다…

한 점이 삼각형 내부에 있는지를 체크하기 더보기

복사/붙여넣기를 지원하는 Swift 타입 작성하기 2

복사/붙여넣기를 지원하는 타입을 작성할 때, 해당 타입은 반드시 직렬화 및 역직렬화가 가능해야 했다. 그런데 NSPasteboardReading 프로토콜은 지정 이니셜라이저를 포함하고 있기 때문에 클래스를 직접 수정하거나 서브클래싱하지 않으면 이 방법을 적용할 수가 없다. 따라서 NSPasteboardItem을 대신 사용하는 방법을 적용해야 한다. 이 때 핵심은 해당 클래스가 어떤 모종의 방법을 사용해서 직렬화 및 역직렬화가 가능해야 한다는 점이다.

복사/붙여넣기를 지원하는 Swift 타입 작성하기 2 더보기

(Swift) 프로토콜 그 자체가 자신을 따르지 않는다

Swift 5.1에 추가된 some 키워드 (불투명 리턴 타입)에 관한 Swift 공식 문서를 살펴보다가 이상한 구절을 발견했다.

Another problem with this approach is that the shape transformations don’t nest. The result of flipping a triangle is a value of type Shape, and the protoFlip(_:) function takes an argument of some type that conforms to the Shape protocol. However, a value of a protocol type doesn’t conform to that protocol; the value returned by protoFlip(_:) doesn’t conform to Shape. This means code like protoFlip(protoFlip(smallTriange)) that applies multiple transformations is invalid because the flipped shape isn’t a valid argument to protoFlip(_:).

프로토콜 타입의 값이 그 프로토콜을 따르지 않는다는 것이다. 왱? 이게 뭔말이지? 특정한 프로토콜을 따르는 객체들은 그 실제 타입에 상관없이 해당 프로토콜을 타입처럼 사용할 수 있다고 했는데, 이번에는 프로토콜 타입의 값이 그 프로토콜을 따르지 않는다라니?

(Swift) 프로토콜 그 자체가 자신을 따르지 않는다 더보기

Lock을 사용하는 스레드 동기화 방법

두 개 이상의 스레드가 하나의 공통 자원에 액세스하려고하면 문제가 발생하는 경우가 있습니다. 만약 해당 자원이 내부 속성이 변하지 않는 객체라면 문제될 것이 없겠습니다만, 내부 속성이 변경이 가능하다면 상황이 달라집니다. 예를 들어 두 개의 스레드 A, B 가 공통된 변수 i 에 접근하는 상황을 가정해봅시다.

i를 상수로 가정하고 그 어떤 스레드에서도 변경하지 않는다면 A, B 스레드는 언제든 i에 접근하여 그 값을 읽을 수 있고, 이 때 i의 정보가 손상되지 않을 것이라 확신할 수 있습니다.

하지만 i 값 자체가 바뀌거나, i가 참조하고 있는 객체의 내부 상태가 바뀔 수 있다면 어떨까요? 스레드 A가 i의 값을 변조하고, 스레드 B가 i의 값을 참조하는 상황을 가정해봅시다. A가 어느시점에 i의 값을 변조하는데, 이와 동시에 스레드 B의 코드 여러 줄에서 i의 값을 반복적으로 참조한다면, B의 입장에서는 아무짓도 하지 않았지만 바로 윗줄에서의 i와 지금 라인에서의 i가 다른 값일 수 있다는 예측할 수 없는 상황에 놓이게 됩니다.

Lock을 사용하는 스레드 동기화 방법 더보기