id 타입

 

 

Objective C언어의 id 타입 C언어 포인터(pointer) 개념과 함께 보면 쉽게 이해할 수 있습니다. Objective Cid 타입 C언어의 포인터(*) 타입을 포함해서 정의한 타입을 의미합니다. 아래 예시처럼 C언어의 void* 타입 typedef 키워드를 사용해서 id로 재정의하면 거의 완전 동일한 모습으로도 사용할 수 있습니다. Objective C에서 id 타입이 존재하는 이유는 Objective C의 모든 오브젝트 변수들은 모두 포인터 타입이기 때문에, 어떤 것도 지칭해서 사용 할 수 있는 id 타입을 만들어서 편하게 사용하기 위함입니다.

 

Objective Cid 타입 C언어의 void* 타입이 완전히 동일한 것은 아닙니다. 사용하다보면 알 수 있는데, 형변환의 여부입니다. Objective Cid 타입은 형변환 없이 그대로 사용이 가능하지만, C언어의 void * 타입은 형변환을 해서 사용해야 합니다.

 

이해를 돋우기 위해, 아래 Objective C C언어에서의 예시를 들어봤습니다.

 

Objective C언어의 id 타입

id myObject = @”My String”;

NSString* myObject = @”My String”;

NSString* myObject = [[NSString alloc] initWithString:@”My String”];

NSString* myObject = [NSString stringWithString:@ “MyString”];

※ 참고, initWithString (사용 중에 해제 되지 않는) retain으로 생성한 것이므로 release를 직접 호출시켜서 해제시켜야 하지만, stringWithString AutoRelease Pool에서 관리하므로 release를 직접 호출시키면 안된다는 차이가 있습니다.

 

C언어의 pointer 타입

typedef void* id;

id myObject = “My String”;

char* myObject = (char *)malloc(sizeof(char) * 10); // 힙 영역에 메모리 할당

char* myObject = (char *)calloc(10, sizeof(char)); // 힙 영역에 메모리 할당

※ 참고, malloc calloc은 둘다 힙 영역의 메모리에 할당하지만, malloc은 할당된 메모리를 그대로 사용하고 calloc은 할당된 메모리를 0으로 모두 초기화한다는 점이 차이가 있습니다.