[8일차]String Objective-C2010. 5. 18. 11:15
String
1. C언어의 문자열은 ASCII Code기반
2. Objective-C 언어의 문자열 클래스는 unicode 기반
멀티바이트 기반 (메서드들은 바이트 단위로 동작함)
3. String 클래스의 종류
- NSString : 내용을 변경할 수 없는 문자열 클래스 (Char *)
- NSConstantString : 문자열 상수로 주소를 변경할 수 없는 문자열 클래스 (Const char *)
- NSMutableString : 내용을 변경할 수 있는 문자열 클래스
(NSString을 상속 + 메모리영역 추가(insert),삭제(delete)를 포함)
@"문자열" 이 NSConstantString
출력시에는 %s를 사용하기가 애매함
%@를 이용해서 인스턴스에게 Description 메서드를 수행한 리턴값을 출력하는 형태를 취함.
-----------------------------------------------------------------------------------
#import <foundation/NSObject.h>
// foundation.h
// #import NSObject.h
#import <foundation/NSString.h>
int main(int argc, char * argv[])
{
NSString * str = @"Programing is Fun"; // 자기에게 메모리를 할당하지 않았음. 포인터 변수
// 상위클래스의 인스턴스는 하위클래서의 인스턴스에 대입가능.
// alloc, 생성자, malloc 를 호출하지 않으면 자신의 메모리 공간은 없다.
NSLog(@"%s",str); // %s는 C언어의 문자배열 출력용
// 뒤에있는 주소부터 null을 만날때까지 1byte 단위로 읽어서 출력을 해라
// NSString 는 MultiByte 임으로 1byte씩 끊어 읽을 경우 문자가 깨지는 현상발생
NSLog(@"%@",str); // 문자열을 출력하는게 아니고
// %@는 인스턴스에게 decription 메서드를 호출해서 문자열로 출력
// str 을 출력하는게 아니라 str 의 decription 메서드 호출
// NSObject
// +(NSString *) description : 클래스 이름 리턴
// -(NSString *) description : 클래스 이름과 id 리턴
// NSString, NSNumber는 decription 을 재정의 해놓았음.
// 값을 문자열로 리턴하도록 재정의됨.
// ToString() 메서드를 재정의 하는것과 같이 Description 을 재정의하여 활용할 수 있음.
system("pause");
return 0 ;
}
-----------------------------------------------------------------------------------
%@을 이용해서 인스턴스 이름만으로 원하는 데이터를 출력하고자 하는 경우에는
description 메서드를 재정의(Overiding)해야 함
-----------------------------------------------------------------------------------
ex)
#import <foundation/NSObject.h>
#import <foundation/NSString.h>
#import <foundation/NSValue.h>
@interface Test : NSObject
// decription 메서드가 이미 존재
// decription : class 이름, id 를 리턴
@end
@implementation Test
@end
@interface Temp : NSObject
{
NSNumber *number;
// 숫자에 관련된 wrapper 클래스
}
-(id)init : (int)n; // 이건 over roading - 매개변수가 동일
-(NSString *) description; //이건 overriding
// -(id)init <= 이렇게 사용하면 재정의
@end
@implementation Temp
-(id)init : (int)n
{
self = [super init]; // 상위클래스 멤버 초기화
if(self !=nil)
number = [NSNumber numberWithInteger : n]; // 자신의 멤버 초기화
// NSNumber가 할당받은 영역에 n을 대입
// 정수로 저장해도 실수로 읽을 수 있음.
// 부호 | 가수부 | 지수
return self;
}
-(NSString *)description
{
return [number stringValue]; // NSNumber 클래스가 소유한 값을 문자열로 리턴
}
@end
int main(int argc,char *argv[])
{
NSNumber *intNumber = [NSNumber numberWithInteger : 100];
NSLog(@"%@",intNumber); // 엄밀히 이야기하면 @"100" 이 출력
// NSLog(@"%d",intNumber); // id
// NSLog(@"%i",intNumber);
Test *obj = [Test new];
NSLog(@"%@",obj); // Test (클래스명) + 어떤숫자 (id)
Temp *Ins = [[Temp alloc]init :100]; // Ins -> isa : Temp 주소
NSLog(@"%@",Ins); // 100 <- 재정의된 문자열
system("pause");
return 0;
}
-----------------------------------------------------------------------------------
NSString의 인스턴스 생성과 문자 코드 변환
+(id)stringWithString:(NSString*)nsstring
-(id)initWithString:(NSString*)nsstring
-(NSUinteger)length // 문자수 리턴
-(id)initWhitUTF8String:(const char *)bytes
// C언어의 문자열 상수 data type
// 을 UTF8 문자열로 변환
-(const char *)UTF8String
// 현재의 문자열을 C언어의 문자열 상수 data type(const char *) 으로 변경하기 위해 사용
// ASCII Code 로 리턴, 파일처리, 메모장에서는 byte 단위 처리하고 있기 때문에 활용됨.
주의)
char * // ? char 배열
const char * // ? 내용을 변경하지 못하는 char 배열
* char * 에서 const char * 로는 data를 줄 수 없음.
ex) cpy(char *, const char *) // 상수를 일반 변수에 대입하겠다는 의미
heap에할당 전역에 할당(변경 불가능)