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

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

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

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

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

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

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

20120102 :: [iOS] 저장이 가능한 간단 메모장 3 (코어데이터)

해당 포스트의 코드가 너무 부끄러운 수준으로 디자인이 잘못돼 있어서 새롭게 작성한 글이 있으니 이 글을 참고해주세요.

이미 세 개의 포스팅(관련글 1, 관련글 2, 관련글 3)을 통해 간단한 메모장 앱을 만드는 방법을 살펴보았는데, 이번에는 완전히 똑같은 앱을 코어데이터를 사용하여 생성하는 방법에 대해 살펴보도록 하겠다. 이 시리즈의 맨 처음에 코어데이터에 대해 언급하면서 초보자에게는 좀 많이 어렵다고 이야기한 바 있는데, 이는 실제로 코어데이터가 사용하기 어려운 프레임워크라는 의미라기보다는 코어데이터를 실제로 사용하기 위해서 알고 있어야 하는 배경 지식이 상당히 많다는 의미라고 보는 것이 정확할 듯 하다. 20120102 :: [iOS] 저장이 가능한 간단 메모장 3 (코어데이터) 더보기

20110621 :: NSString 사용하기

NSString에서 알아두어야할 몇가지 메소드들을 정리해본다.

문자열 생성

포맷에 맞게 문자열을 생성하기

+stringWithFormat: 메소드를 사용한다.

NSString *newStr = [NSString stringWithFormat:@"%@ : %d", someObj.name, someObj.score];

-initWithFormat:의 경우 같은 동작을 하지만, 이 때는 수동으로 alloc하므로 릴리즈의 책임을 져야 한다.

C문자열로부터 생성

initWithUTF8String:, stringWithUTF8String: 을 통해서 const char* 데이터를 NSString 객체로 바꿀 수 있다. 1

다른 인코딩을 된 문자열이라면 initWithCString:encoding:, stringWithCString:encoding:을 사용할 수 있다.

바이너리 데이터로부터 생성

NSData(파일을 읽어들였거나, 네트워크 스트림으로부터 받은)객체로도 이를 만들 수 있다. initWithData:encoding:을 쓴다. 특히 파일의 경우, stringWithContentsOfFile:encoding:error:stringWithContentsOfURL:encoding:error:를 쓸 수 있다.

파일에 쓰기

-writeToFile:atomically:encoding:error:이 가장 기본적인 파일 쓰기 함수이다. URL 베이스의 -writeToURL:atomically:encoding:error:도 있다. 미리 파일을 열고 닫을 필요가 없다.

속성

길이구하기

-length 프로퍼티를 이용한다. 이는 유니코드 문자의 개수를 돌려주는데, 만약 특정 인코딩으로 변환한 후의 데이터 크기를 알고 싶다면 -lengthOfBytesUsingEncoding:을 쓴다.

서브스크립트

특정 위치의 글자는 characterAtIndex:로 구한다. (반환형은 unichar로 유니코드 문자 한 개의 값이다.) 서브 스트링을 구할 때는 getCharacters:range:를 쓴다. 이는 NSString을 돌려주는게 아니라 unichar* 타입의 포인터를 받아서 range만큼 뽑아 복사해준다.

NSString 객체로 된 서브스트링을 얻으려면 substringWithRange:substringFromIndex:, substringToIndex:를 쓴다.

C 문자열 얻기

UTF8String 속성을 사용한다. 별도 인코딩을 쓰려면 cStringUsingEncoding:을 쓴다.

문자열 결합하기

문자열의 배열을 하나로 join 하는 것은 NSArray의 componensJoinedByString:을 사용하면 된다. 그외 다른 문자열을 결합하기위해서는 stringByAppendingString: 이나 stringByAppendingFormat:을 쓴다. (한번 생성된 문자열은 내부 데이터를 변경할 수 없으므로 새로운 문자열을 만들어야 한다.)

문자열 나누기

문자열을 특정 토큰으로 나누어 배열로 만드려면 componentsSeparatedByString: 이나 componentsSeparatedByCharactersInSet:을 이용한다.

문자열 내에서 특정 문자/문자열 찾기

가장 많이 쓰이는 것은 rangeOfString:이다.

문자열 바꾸기

서브스트링 치환은 stringByReplacingOccurrencesOfString:withString:이다. 추가로 범위나 옵션 제한을 두는 stringByReplacingOccurrencesOfString:options:range:도 있다. 그냥 특정 범위를 다른 문자열로 바꾸는 stringByReplacingCharactersInRange:withStirng:도 있다.

프로퍼티리스트 변환

프로퍼티 리스트 파싱을 자동으로 할 수 있다. propertyList, propertyListFromStringsFileFormat 문자열을 프로퍼티리스트로 파싱하면 사전 객체를 리턴해준다.

비교

정렬을 위해서 비교 구문을 쓴다. compare:는 합성글리프에 대한 연산이 정확하지 않으므로 localizedCompare:localizedCaseInsentiveCompare:를 많이 쓴다. 비교 함수의 결과는 NSComparisonResult로 이는 NSOrderAscending | NSOrderEqual | NSOrderDescending중 하나가 된다.

케이스 변환

capitalizedString, lowercaseString, uppercaseString 등이 있다.

숫자값

문자열 내용이 숫자인 경우 intValue, floatValue… 등의 즉시 변환 함수가 있다.

그외 다음 기능들이 있는데, 다 못적겠다….
* URL:
* 퍼센트로 인코딩하기
* file path:
* 파일 경로 구분자 추가/확장하기
* 확장자 확장


  1. initWithCString:, stringWithCString: 이라는 메소드가 있었지만, 없어졌다. 대신 인코딩방식을 주는 것은 가능하다. 

20110621 :: Objective-C의 문자열 포맷팅

Formatting Specifier

전체 내용을 정리한 것은 아니지만 참고 삼아.

  • %@ : 종류에 무관하게 Objective-C 객체를 의미한다. 대부분 descriptionWithLocale이나 description 이 출력된다. NSString을 포맷팅할 때 사용한다.
  • %% : “%” 문자
  • %d, %D, %i : singed-32bit 정수
  • %u, %U : Unsigend-32bit 정수
  • %hi : signed-16bit 정수
  • %ui : unsigned-16bit 정수
  • %qi : signed-64bit 정수
  • %qu : unsigned-64bit 정수
  • %x : signed-32bit 정수를 16진수로 표기함
  • %X : unsigned-32bit 정수를 16진수로 표기함
  • %qx : signed-64bit 정수를 16진수로 표기함
  • %qX : unsigned-64bit 정수를 16진수로 표기함
  • %o, %O : unsigned-32bit 정수를 8진수로 표기함
  • %f : 64비트 소수 (double)
  • %e : 64비트 소수를 부동소수점 형태로 표기함 ex. 3.242343e25
  • %E : 64q비트 소수를 부동소수점 형태로 표기하는데, 대문자 E를 사용함 ex. 8.34234354E5
  • %c : 8비트 unsigned char 문자. 아스키코드일 때는 아스키문자가 표시되고 그외에는 숫자값으로 표시된다.
  • %C : 16비트 유니코드 문자. 아스키코드일때는 아스키문자로 표시되고 그 외에는 u가 앞에 붙는 숫자값으로 표시된다.
  • %s : 널문자로 종료되는 8비트 문자열
  • %S : 널문자로 종료되는 16비트 유니코드 문자열
  • %p : 0x9a와 같이 16진수로 표기되는 void 포인터