본문 바로가기
프로그래밍 놀이터/iOS

[Objective-C] Foundation 프레임워크의 중요 클래스 - NSString, NSMutableString

by 돼지왕 왕돼지 2017. 12. 30.
반응형


 [Objective-C] Foundation 프레임워크의 중요 클래스 - NSString, NSMutableString


출처 : OS X 구조를 이해하면서 배우는 Objective-C Chap 9.

%f, ..., 16진수, 7bit, ANSI C, appendFormat, appendStirng, ASCII, boolvalue, canBeConvertedToEncoding, capitalizedstring, caseInsensitiveCompare, characteratindex, cocoa api, compare, componentsSeparatedByCharactersInSet, cStringUsingEncoding, c문자열, dataUsingEncoding, deleteCharactersInRange, description, doublevalue, fileSystemRepresentation, floatvalue, foundation 프레임워크, getCharacters, hasprefix, init, initWithCapacity, initWithCharacters, initWithContentsOfFile, initWithCString, initWithData, initwithstring, initWithUTF8String, insertString, integervalue, intValue, isAbsolutePath, isEqualToString, iskindofclass, lastPathComponent, length, lineRangeForRange, literal, localizedStandardCompare, lowercasestring, mutablecopy, newline, nil, NSASCIIStringEncoding, NSComparisonResult, NSJapaneseEUCStringEncoding, NSMacOSRomanStringEncoding, NSMutableString, NSNotFound, NSPathUtilies, NSRegularExpression, NSRegularExpressionSearch, NSShiftJISStringEncoding, NSString, NSStringEncoding, NSUTF8StringEncoding, object constant, pathComponents, pathExtension, pathWithComponents, printf, propertylist, rangeofstring, rangeOfString:options:, release, replaceCharactersInRange, replaceOccurencesOfString, setString, stringByAddingPercentEscapeUsingEncoding, stringbyappendingformat, stringByAppendingPathComponent, stringByAppendingPathExtension, stringByAppendingString, stringByDeletingLastPathComponent, stringByDeletingPathExtension, stringByExpandingTildeInPath, stringByReplacingCharatersInRange, stringByReplacingOccurencesOfString, substringfromindex, substringToIndex, substringWithRange, U+2028, U+2029, unicode, Unicode 문자열 조작, uppercaseString, useAuxiliaryFile, UTF-16, utf-8, UTF8String, vararg, writeToFile, [Objective-C] Foundation 프레임워크의 중요 클래스, \n, \r, \r\n, \u, 가비지 컬렉션, 객체, 객체 변경 가능성, 객체 상수 문자열, 검색과 치환, 결합, 경로 조작, 경로명, 공백 무시, 기타, 대소문자 처리, 문자 코드를 지정한 상호 변환, 문자열 클래스, 문자열에 추가, 변경 가능 객체 작성, 변경 가능 객체와 불가능 객체, 부분 문자열, 비교, 삭제, 삽입, 상수 객체, 생성, 서브 클래스 작성, 서식에 따른 문자열 작성, 숫자 값 평가, 인스턴스 초기화, 정규식, 정규표현식, 출력, 치환, 클래스 클러스터, 파일 입, 한글 utf-8


Notice : 정리자(돼지왕 왕돼지)가 remind 하고 싶은 내용이나 모르는 내용 기반으로 정리하는 것이기 때문에 구체적인 내용은 책을 사서 보시기를 권장드립니다.


9.1. 객체 변경 가능성


* 9.1.1. 변경 가능 객체와 불가능 객체



* 9.1.2. 변경 가능 객체 작성


-

변경 불가능 객체를 변경 가능 객체로 다루고 싶을 때는 어떻게 할까?

mutableCopy 메서드로 변경 가능한 복사본을 작성한다.




9.2. 문자열 클래스


* 9.2.1. 객체 상수 문자열


-

문자열을 “ “ 로 둘러싸고 그 앞에 @ 를 붙이면 literal 로 만들 수 있다.

이렇게 작성한 문자열은 문자열 객체의 객체 상수(Object constant) 가 된다.



-

ANSI C 문자열 상수와 마찬가지로 빈칸을 두고 여러 문자열 상수 객체를 배열하면 컴파일 할 때 결합된다.

#define Manufacturer @“Phantom Cookie, Inc."

#define Year @“2005"

NSString* note = @“Copyright “ Year @“ “ Manufacturer;



-

문자열 객체는 Unicode 를 쓸 수 있다.

이것은 [‘\u’ + 4자리 16진수] 또는 [‘/U’ + 8자리 16진수] 형식이다.

NSString* euro = @“Euro=\u29ac”;

NSString* clef = @“G-clef=\U0001d11e”; // clef 는 높은음자리표



-

문자열 상수는 프로그램 실행 시작부터 끝날 때까지 계속 존재해서 release 메서드를 호출하거나 가비지 컬렉션이 동작해도 해제되지 않는다.




* 9.2.2. NSString


-

문자열 객체는 내부 문자 코드로 Unicode 를 사용한다.



-

C 언어에 문자열이 있는데도 왜 문자열 객체를 사용하는 걸까?

우선 문자열 객체도 객체이므로 다른 객체와 똑같이 다룰 수 있다.

예를 들어 배열 객체와 사전 객체에 저장하려면 객체이어야만 한다.

isKindOfClass: 같은 문의에도 답을 줄 수 있고, 생성과 해제 방법도 마찬가지이다.


또한 문자열을 결합하거나 부분 문자열을 추출하거나 파일 경로로 보고 조작하는 등 편리한 메서드가 풍부하게 제공된다.


변경 가능한 문자열일 때는 문자열 길이를 신경 쓰지 않아도 프로그래밍 할 수 있다.


또한 Cocoa API 로 문자열을 다룰 때면 C 문자열이 아니라 문자열 객체를 이용하는 것이 전제로 구성되어 있다.



-

NSString 은 클래스 클러스터로 제공되므로 NSString 가 인스턴스의 직접 클래스가 아닌 점, 그리고 보통 방법으로는 서브 클래스가 작성되지 않는다는 점에 주의해야 한다.



** Unicode 문자열 조작


-

문자열 객체는 문자를 Unicode 로 표현한다.

Unicode 중 UTF-8 은 ASCII 코드 7비트 문자범위가 ASCII 코드와 공통.

따라서 문자열이 ASCII 7비트 범위 안에 있는 문자만이라면 UTF-8 의 Unicode 문자열로 다룰 수 있다.


UTF-16 이라면 ASCII 문자열로 다룰 수 없다.

한글은 UTF-8 이다.



-

- (id) initWithUTF8String: (const char*) bytes

     문자 코드가 UTF-8 이고 null 문자로 끝나는 형식의 C 문자열에서 정보를 복사해서 리시버를 초기화한다.

     편의생성자 : stringWithUTF8String:


- (__strong const char*) UTF8String

     문자코드가 UTF-8 이고 null 문자로 끝나는 형식의 C 문자열을 가리키는 포인터를 돌려준다.


- (NSUInteger) length


- (unichar) characterAtIndex: (NSUInteger) index

     문자는 Unicode 이다.


- (id) initWithCharacters: (const unichar*) characters length:(NSUInteger) length

     도중에 null 문자 ‘\0’ 이 들어 있더라도 거기서 문자열이 끊기지 않는다.

     편의생성자 : stringWithCharacters:length:


- (void) getCharacters:(unichar*) buffer range: (NSRange) aRange



** 문자 코드를 지정한 상호 변환


-

NSStringEncoding 형은 다음이 있다.

     NSASCIIStringEncoding : 7비트 ASCII 인코딩

     NSUTF8StringEncoding: Unicode 문자의 8비트 표현

     NSMacOSRomanStringEncoding : Mac OS 인코딩

     NSJapaneseEUCStringEncoding : 일본어 8비트 EUC 인코딩

     NSShiftJISStringEncoding : 일본어 8비트 JIS 인코딩



-

- (id) initWithCString: (const char*) nullTerminatedCString encoding: (NSStringEncoding) encoding

     편의생성자 : stringWithCString:encoding


- (__strong const char*)cStringUsingEncoding:(NSStringEncoding)encoding


- (id) initWithData: (NSData*) data encoding: (NSStringEncoding) encoding


- (NSData*) dataUsingEncoding: (NSStringEncoding) encoding


- (BOOL) canBeConvertedToEncoding: (NSStringEncoding) encoding


- (NSString*) stringByAddingPercentEscapeUsingEncoding: (NSStringEncoding) encoding;




** 서식에 따른 문자열 작성


-

C 언어 printf() 라면 대다수 컴파일러에서 서식 지정자에 대응하는 인수로 형변환을 적용한다.

예를 들어 실수값을 나타내는 ‘%f’ 에 대해 정수를 인수로 지정해도 결과는 바르게 표시된다.

NSString 메서드로 서식을 써서 문자열을 생성할 때는 이런 형변환을 하지 않는다.

따라서 서식지정자와 인수형은 정확하게 대응하도록 주의해야 한다.



-

Objective-C 에서는 C 언어 함수와 마찬가지로 개수가 정해지지 않은 인수 목록을 가진 메서드를 정의할 수 있다.

이 때 인수 목록 끝에 콤마를 찍고 … 을 적는다.



** 비교


-

- (NSComparisonResult) compare: (NSString*) aString

     리시버와 인수 문자열을 비교한 결과를 돌려준다.

     인수는 nil 이어서는 안 된다.

     문자열이 서로 같은지를 확인하는 것이 목적이라면 isEqualToString: 메서드를 이용한다.


- (NSComparisonResult) caseInsensitiveCompare: (NSString*) aString

     compare:options: 메서드로 옵션을 지정하면 다른 비교 방법도 구현할 수 있다.


- (NSComparisonResult) localizedStandardCompare: (NSString*) aString

     Mac 의 Finder 에서 파일명을 정렬하는 것과 같은 방법으로 문자열을 비교한다.


- (BOOL) isEqualToString: (NSString*) aString


- (BOOL) hasPrefix: (NSString*) aString

     인수가 리시버 끝부분과 일치하는지 확인하려면 hasSuffix: 를 사용한다.

     commonPrefixWithString:options: 를 사용하면 리시버와 인수의 앞부분에서부터 공통된 문자열을 찾아낼 수 있다.



** 결합


-

- (NSString*) stringByAppendingString: (NSString*) aString


- (NSString*) stringByAppendingFormat: (NSString*) format, ...



** 부분 문자열


-

- (NSString*) substringToIndex: (NSUInteger) anIndex


- (NSString*) substringFromIndex: (NSUInteger) anIndex


- (NSString*) substringWithRange: (NSRange) aRange






** 검색과 치환


-

- (NSRange) rangeOfString: (NSString*) aString

     발견하지 못하면 위치가 NSNotFound(매크로 정의) 이고 길이가 0인 정보가 돌아온다.

     rangeOfString:options: 를 사용하면 대소문자 무시하는 등의 옵션 지정이 가능하다.


- (NSRange) lineRangeForRange: (NSRange) aRange

     인수로 지정한 문자범위를 포함한 행 범위를 돌려준다.

     행이란 행 끝을 나타내는 문자로 구분되는 범위를 나타낸다.

     예를 들어 위치와 길이가 0인 범위를 인수로 지정하면 리시버 첫 행을 나타내는 범위를 돌려준다.

     문자열을 행마다 처리하고 싶을 때 유용한 메서드이다.

     행 끝을 나타내는 문자는 \r, \n, \r\n, U+2028, U+2029 등이 있다.


- (NSString*) stringByReplacingCharatersInRange: (NSRange) range withString: (NSString*) replacement


- (NSString*) stringByReplacingOccurencesOfString: (NSString*) target withString: (NSString*) replacement



-

검색에 정규표현식을 이용할 수 있다.

이용 가능한 정규표현식은 클래스 NSRegularExpression 의 레퍼런스를 참고



-

정규표현식을 이용한 검색/치환은 옵션에 NSRegularExpressionSearch 를 지정한다.

다음 예는 문자열 str 안에서 (구) 우편번호( 세자리 - 세자리 ) 가 있으면 그 위치를 돌려준다.

[str rangeOfString:@“[0-9]{3}+-[0-9]{3}+” options:NSRegularExpressionSearch];



** 대소문자 처리


-

lowercaseString, uppercaseString 은 각각 소문자와 대문자화한다.



-

capitalizedString 은 리시버 속 단어의 첫 글자를 대문자로, 남은 부분을 소문자로 변환한다.



** 숫자 값 평가


-

doubleValue, floatValue, intValue, integerValue, boolValue 는 각각 double, float, int, NSInteger, BOOl 형 값으로 평가한 값을 돌려준다.

이 때 어떠한 경우라도 앞부분의 공백은 무시된다.



-

boolValue 는 리시버 문자열의 첫문자가 Y, y, T, t 또는 첫글자에 0 이외의 10진수가 오면 YES 를 돌려준다.



** 경로 조작


-

문자열이 파일 경로명을 나타낼 때 편리한 메소드가 있다.

이것들은 NSPathUtilies.h 에 인터페이스가 정의되어 있다.



-

아래 함수들은 @“tmp/image/cat.tiff” 일 때에 대한 결과값 예시를 포함한다.


- (NSString*) lastPathComponent

     cat.tiff 가 나온다.


- (NSString*) stringByAppendingPathComponent: (NSString*) aStr

     필요하다면 경로 구분 문자를 사이에 끼워넣는다.


- (NSString*) stringByDeletingLastPathComponent

     구성 요소를 삭제한 경로가 최상위 디렉터리가 아니라면 경로 구분 문자로 삭제한다.

     /tmp/image 가 나온다.


- (NSString*) pathExtension

      확장자를 돌려준다.

     확장자에는 . 가 포함되지 않는다.

     확장자가 없을 땐 빈 문자열이 돌아온다.


- (NSString*) stringByAppendingPathExtension: (NSString*) aStr

     . 와 인수로 지정한 문자열을 경로 확장자로 리시버 끝에 추가한다.


- (NSString*) stringByDeletingPathExtension

     확장자를 삭제한다. . 도 삭제된다.


- (BOOL) isAbsolutePath


+ (NSString*) pathWithComponents: (NSArray*) components

     절대 경로를 작성하려면 첫 요소에 @“/“ 를 지정한다.


- (NSArray*) pathComponents

     절대 경로라면 배열의 첫 요소는 @“/“ 가 된다.


- (NSString*) stringByExpandingTildeInPath

     경로의 첫 요소가 ~/ 이거나 ~userName/ 처럼 ‘~’ (틸다) 로 시작할 때 사용자 홈 디렉터리 경로로 바꾼 새로운 문자열을 돌려준다.

     반대로 stringByAbbreviatingWithTildeInPath 는 ~ 를 쓴 방법으로 바꾼다.


- (__strong const char*) fileSystemRepresentation

     시스템 콜 등에 사용되는 C 문자열을 돌려준다.



** 파일 입, 출력


-

- (id) initWithContentsOfFile: (NSString*) path encoding: (NSStringEncoding) enc error: (NSError**) error

     편의생성자 : stringWithContentsOfFile:encoding:error:


- (id) initWithContentsOfFile: (NSString *) path usedEncoding: (NSStringEncoding*) enc error: (NSError**) error

     파일에서 쓰는 문자 코드를 자동으로 판단에서 인수 enc 에 돌려준다.

     제대로 판별하지 못 할 때도 있다.

     편의생성자 : stringWithContentsOfFile:usedEncoding:error:


- (BOOL) writeToFile: (NSString*) path atomically: (BOOL) useAuxiliaryFile encoding: (NSStringEncoding) enc error: (NSError**) error

     useAuxiliaryFile 이 YES 일 경우에는 우선 작업용 파일에 써 넣고 정상적으로 쓰기가 끝나면 path 로 지정한 파일명으로 변경한다.

     이미 같은 이름의 파일이 있으면 처리 중간에 에러나 중단이 일어나도 원래 파일이 망가지는 일은 없다.

     useAuxiliaryFile 이 NO 일 때는 지정한 파일에 직접 쓴다.



** 기타


- (id) init

     편의생성자 : string


- (id) initWithString: (NSString*) aString

     편의생성자 : stringWithString:


- (NSString*) description


- (id) propertyList

     NSString, NSData, NSArray, NSDictionary 로 구성된 프로퍼티 리스트를 만들어서 돌려준다.


- (NSArray*) componentsSeparatedByCharactersInSet: (NSCharacterSet *) sep




9.2.3. NSMutableString

** 인스턴스 초기화, 생성


-

- (id) initWithCapacity: (NSUInteger) capcaity

     편의생성자 : stringWithCapacity:



** 문자열에 추가


-

- (void) appendStirng: (NSString*) aString


- (void) appendFormat: (NSString*) format, ...



** 삽입, 삭제, 치환


-

- (void) insertString: (NSString*) aString atIndex: (NSUInteger) loc


- (void) deleteCharactersInRange: (NSRange) range


- (void) setString: (NSString*) aString


- (void) replaceCharactersInRange: (NSRange) aRange withString: (NSString*) aString


- (NSUInteger) replaceOccurencesOfString: (NSString*) target withString: (NSString*) replacement options: (NSStringCompareOptions) opts range: (NSRange) searchRange

     바꾼 횟수가 메서드 반환값이다.





반응형

댓글