[Objective-C] 프로퍼티의 atomic / nonatomic 속성

Objective-C에서 사용하는 프로퍼티(@property)는 알고보면 엄청나게 중요하더라. 이 프로퍼티를 선언할 때 속성을 지정하는데, 그 중에 nonatomic 이라고 거의 대부분의 객체 타입의 프로퍼티에는 명시해주는데, 이에 대해서 속시원히 설명해주는 글을 찾기가 힘들었다. 물론 멀티스레드 처리에서 해당 값을 안전하게 접근할 수 있도록 해주는 내용이고, 그게 별로 필요가 없으니 보통은 명시적으로 nonatomic으로 쓴다고는 하지만… 암튼 나름대로의 설명은 아래와 같다(…고 본다.)

OS나 프로그래밍에서 ‘atomic’이라는 말은 ‘중단되지 않는다’는 의미를 가진다. 즉 atomic한 함수는 그 전체가 실행되는 동안 중단되거나 CPU에 의해 스와핑되지 않는다. 무슨 말인고 하니, CPU는 한 번에 한 가지 일만 처리하는데, 많은 OS에서는 멀티스레딩을 지원한다. 이는 ‘시분할’이라는 기술에 의해서 아주 짧은 시간동안 운영체제가 각기 다른 프로세스에게 번갈아가면서 CPU의 사용 권한을 허락하기 때문이다. 워낙의 짧은 단위로 시간을 쪼개어 사용하기 때문에 사람이 인지하기에는 여러 가지 프로세스가 동시에 일을 처리하는 것 처럼 보일 뿐이다. (사실상 멀티 스레드는 일종의 잔상을 이용한 환영과 같은 술수이다.)

이를 위해 CPU 스케줄러는 어떤 프로세스의 동작 중에 이를 중지하고 다른 프로세스에게 CPU 사용 권한을 넘기는 것이 가능하다. (또 이렇게 하고 있다.) 따라서 두 개의 프로세스가 동시에 참조하는 변수를 업데이트하는 동작을 수행하기 위해서는 이 과정이 ‘atomic’하게 처리되어야 한다.

Objective-C에서 어떤 프로퍼티를 두 개의 스레드가 참조하고 있는 상황에서 이 프로퍼티의 접근자 메서드가 atomic 하지 않다면 한쪽에서는 A라는 값을 B라는 값으로 변경했는데, 다른 쪽에서는 그 때 새로 업데이트된 B라는값이 아닌 A라는 값으로 읽어가게 되는 문제가 생길 수 있다. 혹은 A값을 읽어야 하는데 읽는 중간에 B값으로 변경되어 문제가 발생할 수도 있을 것이다.

이런 경우에는 해당 프로퍼티를 atomic으로 설정해야 한다. 하지만 atomic으로 설정된 프로퍼티의 setter/getter 메서드는 lock을 사용하여 다중 스레드에 대해 안전하게 처리가되는데, 이 경우는 일반적인 경우에는 고려할 필요가 없으며 성능을 저하시킬 수 있으므로 대부분의 프로퍼티 선언에서는 명시적으로 nonatomic으로 선언한다. (Objective-C에서는 atomic이 디폴트로 설정된다.)

[Objective-C] 한글의 초성, 중성, 종성 분리하기

유니코드 한글의 코드 값 구성 원리와 이를 토대로 각 음절의 초/중/종성을 분리하는 방법은 강호경님의 블로그에 자세하게 나와있으니, 여기서는 자세한 설명을 생략한다.

위 블로그의 내용을 토대로 클래스를 하나 만들어 초성, 중성, 종성을 추출하는 클래스 메소드를 가진 클래스를 하나 작성하고 이를 사용하여 입력된 파라미터로부터 한글의 초성을 뽑아 뱉어주는 명령줄 도구를 작성한 것이다.

소스코드 다운로드 : http://www.box.com/s/mxmoq5vc3ii5z5di5op2

이전 글에서 사용한 애플 스크립트는 이 명령줄 도구를 애플 스크립트에서 호출하여 이름 필드 값의 초성을 추출하여 이를 별명 필드에 입력하고 저장하는 내용이다.1 아이폰은 spotlight 검색이나 주소록 앱에서 검색 시 별명 필드를 검색하므로, 이를 통해 초성 검색 기능을 이용할 수 있다.

 

  1. 스크립트 작성 설명은 귀찮으니 패스한다.

맥 주소록에서 이름의 초성을 별명으로 자동저장하기

애플 스크립트와 자체제작한 명령줄 도구를 사용해서 OSX 주소록의 이름 중 한글의 초성을 따내 이를 자동으로 별명으로 저장해주는 도구입니다.

사용방법

  1. 글 맨 하단의 다운로드 링크를 통해 파일을 내려받는다.
  2. 압축을 해제하고 속에 들어있는 “별명추가” 스크립트를 실행한다.
  3. 이후 아이폰과 동기화하면 아이폰에서도 초성으로 주소록 검색이 가능해진다.

주의사항

  • 스크립트와 명령줄 도구는 공개하지만, 이를 사용한 결과는 순전히 자신의 책임입니다.
  • “이름(first name)” 항목만 변환합니다. “성(last name)” 필드는 검색하지 않아요.
  • 초성변환은 Chosung 앱이 합니다. 터미널에서 Chosung <한글문자열> 을 입력하면 해당 문자열의 초성만 반환하니 따로 쓰셔도 됩니다.

다운로드링크 : http://www.box.com/s/0lcmd3rxl9klfgipltbi

사유하지 않는 블로그

블로깅을 시작한지 놀랍게도 10년째를 맞이하고 있다. 1000개가 안되는 이 빈약한 아카이브의 수는 잡답부터 시작해서 여러 이야기들을 했던 지난 10년간의 블로그 생활이 얼마나 허접했나를 말해주는 증거일 수도 있지만, 첨엔 아주 아주 열심히 글을 쓰던 시절도 있었더랬다. 지금의 워드프레스로 옮겨오면서 이글루스에서 시작했던 블로그 내용 중 대다수를 유실하였고, 중간에 또 한 번 DB를 날려먹으면서 (그게 약 3년전 쯤인데) 당시 글의 절반 이상을 또 유실하였다.

웹을 통한 로깅이라는 블로그의 정의와는 참 맞지 않게도, 나의 블로그는 그저 유실의 흔적일 뿐이었던 것일까. 조금 전 최근 글들을 훑어보다, 너무 튜토리얼 위주의 글만 보여서 나 스스로에게 조금 실망했다. 물론 나 스스로의 공부의 흔적이기도 하고, 팁 위주의 글이 다른 누군가에게는 도움이 될 수도 있겠지만, 어느 때부터 이 블로그에서는 ‘고민의 흔적’ 같은 것들이 점점 옅어지고 있다는 게 참 아쉽다고나 할까.

어쨌거나 제목에서 날짜를 빼는 것부터 시작해서 블로그 운영에 대한 전반적인 재고가 필요한 시점인 것 같다. 치열하게 사는 것도 좋지만 치열하게 생각하는 것. 그것이 아직까지는 더 필요한 시점이 맞을테니까.

20120126 :: Dock의 그리드 아이콘 크기 변경

Dock의 우측 부분에는 응용 프로그램 아이콘이 아닌 폴더를 집어 넣어, 해당 폴더의 내용에 빠르게 접근할 수 있는 스택이 있다. 이 스택은 설정하기에 따라서 부채꼴로 펼쳐지는 스택이 될 수도 있고, 가로/세로 사각형의 형태로 배열되는 그리드가 될 수도 있다. (물론 아이콘 항목이 많은 폴더는 그리드로 설정된다.)

화면의 크기가 비교적 작은 맥북의 경우에는 이 그리드의 아이콘 크기가 좀 작은 편이고, 화면이 큰 아이맥에서는 이 그리드 아이콘이 크게 표시되는데, 트랙패드를 사용하는 경우에는 아이콘이 큰 만큼 마우스 포인터가 화면을 이동해야 하는 경로가 커져서 은근히 피로감을 느끼게 된다.

그리드의 아이콘이 클 때

이 경우에는 ⌘키를 누른채로 +/- 키를 눌러 그리드의 아이콘 크기를 조절할 수 있다.