클래스를 나타내는 객체
변수 선언에서 클래스 이름을 지정하고 해당 클래스 형식의 변수를 제공할 수 있습니다. 그러나, 클래스 메서드를 호출하기 위해 메시지식으로 지정된 클래스 이름은 사실 클래스 형식을 나타내는 것은 아닙니다. 메시지식으로 지정하는 것은 항상 메시지를 보내는 객체입니다. 즉, 메시지식으로 지정하고 있는 클래스 이름은 인스턴스, 즉 객체입니다.
클래스 인스턴스를 생성하도록 컴파일 된 클래스는 클래스 자신의 정보를 나타내는 클래스 객체를 보유하고 있습니다. 이 클래스 객체는 Class 형식의 변수에 저장할 수 있습니다. 클래스 객체가 존재하지 않는 값은 Nil이라는 상수로 표현됩니다. 일반적으로 Nil은 NULL과 마찬가지로 0을 나타냅니다.
클래스 객체를 가져오려면, 인스턴스가 존재할 경우는 Object 클래스의 class 인스턴스 메서드의 반환 값을 가져오면 됩니다. 인스턴스가 존재하지 않는다면, 클래스 이름을 알고있는 경우, 클래스 이름을 직접 지정하여 클래스 객체를 검색할 수 있습니다. 일반적으로 클래스 이름으로 인식되지만, 메시지 식의 메시지 대상 객체를 지정하여 클래스 이름을 지정한 경우에만 클래스의 클래스 객체로 인식됩니다. 메시지식으로 클래스 이름이 지정된 클래스 객체를 반환하려면 클래스 객체에 class 메시지를 보냅니다. 이 메서드는 다음과 같이 선언되어 있습니다.
- (Class) class;
이 메서드가 반환하는 값은 Class 형식의 객체입니다. 클래스 객체 변수에 저장할 수 있기 때문에 클래스 메서드를 호출하는 메시지 식은 변수에 저장되는 객체에 따라 결과가 다양하게 나타나므로, 다양성을 가질 수 있습니다.
#import <stdio.h>
#import <objc/Object.h>
@interface Test : Object
+ (void) Write;
- (id) init;
@end
@implementation Test
+ (void) Write
{
printf ( "I love you ... so please do not love me \n");
}
- (id) init
{
printf ( "You can be whatever \n");
return [super init];
}
@end
int main()
{
Class testClass = [Test class];
[testClass Write];
[testClass new] free];
[testClass free];
return 0;
}
이 프로그램에서 Test class의 Test는 사실 클래스 형식이 아닌 클래스 객체를 메시지식으로 지정하고 있습니다. 메시지식은 Test 클래스의 클래스 객체를 반환하고 testClass 변수에 객체를 저장합니다. 이후 testClass 변수는 메시지식으로 Test 클래스 객체와 동일한 의미를 가집니다.