[Objective-C] Foundation 프레임워크의 중요 클래스 - NSString, NSMutableString |
출처 : OS X 구조를 이해하면서 배우는 Objective-C Chap 9.
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
바꾼 횟수가 메서드 반환값이다.
'프로그래밍 놀이터 > iOS' 카테고리의 다른 글
[Objective-C] Foundation 프레임워크의 중요 클래스 - NSDictionary, NSValue, NSNumber, NSURL (0) | 2018.01.01 |
---|---|
[Objective-C] Foundation 프레임워크의 중요 클래스 - NSData, NSArray, NSSet (0) | 2017.12.31 |
[Objective-C] NSObject 클래스와 런타임 시스템 (0) | 2017.12.29 |
[Objective-C] 선언 프로퍼티 (0) | 2017.12.28 |
[Objective-C] 참조 카운터를 사용한 메모리 관리 방법 (0) | 2017.12.27 |
댓글