달력

10

« 2024/10 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
2010. 5. 18. 11:15

[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에할당    전역에 할당(변경 불가능)


:
Posted by 에너지발전소