Creating and Converting String Objects
OSXDEV
NSString과 그 서브클래스인 NSMutableString은 대부분 지원하는 다양한 캐릭터 인코딩에 기반한 스트링 객체를 생성하는 방법을 몇가지 제공합니다. 스트링 객체가 자신의 내용을 항상 유니코드 캐릭터로 표현하지만, 컨텐츠를 7 비트 아스키, ISO Latin 1, EUC, Shift-JIS와 같이 다른 많은 인코딩으로 변환하거나 다른 인코딩으로부터 유니코드로 변환할 수 있습니다. 클래스 메소드인 availableStringEncodings는 지원되는 인코딩을 반환합니다. C 스트링으로부터 스트링객체로/로부터 변환할 때, 명시적으로 인코딩을 지정하거나, 플랫폼마다 차이가 있으며 defaultCStringEncoding 클래스 메소드로 반환되는 기본 C 스트링 인코딩을 사용할 수 있습니다.
목차 |
[편집] Creating Strings
소스코드에서 스트링 객체를 생성하는 가장 쉬운 방법은 Objective-C @"..." 컨스트럭트를 사용하는 것 입니다.
NSString *temp = @"/tmp/scratch";
이런 식으로 스트링 상수를 생성할 때, 7비트 아스키 캐릭터만 사용하도록 해야합니다. 이런 객체는 컴파일 시에 생성되어 프로그램이 수행되는 내내 존재합니다. 컴파일러는 모듈 마다 이런 객체 상수가 유일하게 만들어주며 다른 객체들에 하듯이 이들 객체 상수를 리테인하고 릴리즈 할 수는 있지만 결코 할당해제되지는 않습니다. 다른 스트링과 마찬가지로 스트링 상수에 메시지를 직접 보낼 수도 있습니다.
BOOL same = [@"comparison" isEqualToString:myString];
[편집] NSString from C Strings and Data
C 스트링으로부터 NSString 객체를 생성하려면 initWithCString:encoding:과 같은 메소드를 사용해야만 합니다. C 스트링의 캐릭터 인코딩을 알맞게 지정해 주는 것이 중요합니다. 비슷한 메소드를 사용하여 다양한 인코딩의 캐릭터로부터 스트링을 생성할 수 있습니다. initWithData:encoding:은 NSData객체에 저장된 스트링 데이터를 NSString 객체로 변환해줍니다.
char *utf8String = /* assume this exists */ ;
NSString *stringFromUTFString = [[NSString alloc] initWithUTF8String:utf8String];
char *macOSRomanEncodedString = /* assume this exists */ ;
NSString *stringFromMORString =
[[NSString alloc] initWithCString:macOSRomanEncodedString
encoding:NSMacOSRomanStringEncoding];
NSData *shiftJISData = /* assume this exists */ ;
NSString *stringFromShiftJISData =
[[NSString alloc] initWithData:shiftJISData
encoding:NSShiftJISStringEncoding];
다음 예제는 UTF-8 캐릭터를 포함하는 NSString 객체를 아스키 데이터로 전환한 후, 다시 NSString객체로 변환합니다.
unichar ellipsis = 0x2026; NSString *theString = [NSString stringWithFormat:@"To be continued%C", ellipsis]; NSData *asciiData = [theString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; NSString *asciiString = [[NSString alloc] initWithData:asciiData encoding:NSASCIIStringEncoding]; NSLog(@"Original: %@ (length %d)", theString, [theString length]); NSLog(@"Converted: %@ (length %d)", asciiString, [asciiString length]); // output: // Original: To be continued… (length 16) // Converted: To be continued... (length 18)
[편집] Variable Strings
스트링 변수를 생성하려면 보통 stringWithFormat:이나 initWithFormat: 메소드를 사용합니다.(로컬라이즈된 스트링은 localizedStringWithFormat:을 사용합니다.) 이들 메소드와 관련 메소드들은 포맷 스트링을 제공한 값(스트링과 다른 객체, 숫자값, 등)이 삽입될 템플릿으로 사용합니다. 이들과 지원되는 포맷 지시자는 "Formatting String Objects"에 설명되어 있습니다.
기존의 스트링 객체에 stringByAppendingString:과 stringByAppendingFormat:을 사용하여 스트링을 붙여넣거나 포맷 스트링을 사용하는 스트링 객체를 만들 수 있습니다.
NSString *hString = @"Hello"; NSString *hwString = [hString stringByAppendingString:@", world!"];
[편집] Strings to Present to the User
스트링을 생성하고 사용자에게 보여줄 때, 프로그램 로컬라이징의 중요성을 고려해야합니다. 일반적으로 사용자에게 보여질 스트링을 코드에서 직접 작성하는 것은 피해야 합니다. 대신, 코드에서는 사용자가 선호하는 언어로 사용자에게 보여지는 스트링을 제공해줄 로컬라이제이션 딕셔너리로 스트링을 사용해야합니다. 주로, 다음 예제에서와 같이 NSLocalizedString과 비슷한 매크로를 사용합니다.
NSString *greeting = NSLocalizedStringFromTable
(@"Hello", @"greeting to present in first launch panel", @"greetings");
응용프로그램의 국제화에 대해서는 Internationalization Programming Topics를 참고하십시오. String Files에서 로컬라이즈드 스트링을 다루는 방법과 그 안의 변수 인자들을 재배열하는 방법을 설명합니다.
[편집] Combining and Extracting Strings
다양한 방식으로 스트링을 결합하고 추출할 수 있습니다. 두개의 스트링을 통합하는 가장 쉬운 방법은 하나를 다른 하나에 붙이는 것입니다. stringByAppendingString: 메소드는 리시버와 주어진 인자로부터 생성된 스트링 객체를 반환합니다.
NSString *beginning = @"beginning"; NSString *alphaAndOmega = [beginning stringByAppendingString:@" and end"]; // alphaAndOmega is @"beginning and end"
initWithFormat:, stringWithFormat:, stringByAppendingFormatL 메소드의 템플릿에 따라 다수의 스트링을 결합할 수도 있습니다. 이들은 "Formatting String Objects"에서 더 상세히 설명되어 있습니다.
substringToIndex:, substringFromIndex:, substringWithRange:메소드를 사용하여 스트링의 처음이나 마지막에서 특정 인덱스까지, 혹은 특정 범위로부터 서브스트링을 추출할 수 있습니다. 또한 componentsSeparatedByString: 메소드를 사용하여 스트링을 (분리 스트링에 기반하여) 서브스트링으로 분리할 수도 있습니다. 이들 메소드는 다음 예제에 묘사되어 있습니다. 인덱스 기반 메소드의 인덱스가 0에서 시작하는 것을 염두에 두십시오.
NSString *source = @"0123456789";
NSString *firstFour = [source substringToIndex:4];
// firstFour is @"0123"
NSString *allButFirstThree = [source substringFromIndex:3];
// allButFirstThree is @"3456789"
NSRange twoToSixRange = NSMakeRange(2, 4);
NSString *twoToSix = [source substringWithRange:twoToSixRange];
// twoToSix is @"2345"
NSArray *split = [source componentsSeparatedByString:@"45"];
// split contains { @"0123", @"6789" }인덱스 대신 패턴-매칭을 사용하여 스트링을 추출해야한다면 스캐너를 사용해야 합니다. "Scanners"를 참고하십시오.
[편집] Getting C Strings
스트링 객체로부터 C스트링을 얻으려면 UTF8String을 사용하는 것이 좋습니다. 이 메소드는 UTF8 스트링 인코딩을 사용하는 const char *를 반환합니다.
const char *cString = [@"Hello, world" UTF8String];</br>
여기서 받게되는 C 스트링은 임시 객체로 자동 할당 해제가 되면 무효화될 것입니다. 만일 영속적인 C스트링을 얻길 원한다면 버퍼를 생성하고 이 메소들에 의해 반환되는 const char *의 컨텐츠를 카피해야할 것입니다.
비슷한 메소드를 사용하여 캐릭터로 스트링 객체를 유니코드 인코딩이나 그 밖의 인코딩으로 생성하고 이들 인코딩으로 데이터를 추출할 수 있습니다. initWIthData:encoding:과 dataUsingEncoding:은 NSData객체로, 혹은 객체로부터 이런 변환을 합니다.
[편집] Conversion Summary
이 테이블은 스트링 객체를 생성하고 변환하는 가장 흔한 방법을 요약합니다.
| 소스 | 생성 메소드 | 추출 메소드 |
|---|---|---|
| 코드 내부 | @"..." 컴파일러 컨스트럭트 | N/A |
| UTF8 인코딩 | stringWithUTF8String: | UTF8String |
| 유니코드 인코딩 | stringWithCharacters:length: | getCharacters:
getCharacters:range: |
| 그 밖의 인코딩 | initWithData:encoding: | dataUsingEncoding: |
| 기존의 스트링 | stringByAppendingString:
stringByAppendingFormat: | N/A |
| 포맷 스트링 | localizedStringWithFormat:
initWithFormat:locale: | NSScanner 사용 |
| 로컬라이즈드 스트링 | NSLocalizedString 과 기타 | N/A |
| 기본 C 스트링 | stringWithCString: 은 더이상 사용되지 않음 - 추천하지 않음 | 사용하지 말것 |
| 번역자 | 사용자:Idiel |
| 원본문서링크 | http://developer.apple.com/documentation/Cocoa/Conceptual/Strings/introStrings.html (Last Updated - 2007-10-18) |




