변수 선언 등으로 클래스 이름을 지정하고 그 클래스 형의 변수를 준비 할 수있었습니다. 그러나 클래스 메서드를 호출하기 위해 메시지 식에서 지정한 클래스 이름은 사실 클래스의 형태를 나타내고있는 것은 아닙니다. 메시지 식으로 지정하는 것은 항상 메시지를 보낼 수있는 개체입니다. 즉, 메시지 식으로 지정하고 클래스 이름은 개체입니다.
클래스가 인스턴스를 생성하도록 올바르게 컴파일 된 클래스는 자신의 정보를 나타내는 클래스 객체를 보유하고 있습니다. 이 클래스 객체는 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 클래스 오브젝트와 같은 의미를가집니다.
이 위력은 다음 Write 클래스 메소드를 실행하기 위해 [testClass Write 메시지 식으로 실현할 수 있다고 부분에서 확인할 수있는 것입니다. 클래스 오브젝트를 가리키는 변수로부터 Write 메세지를 전송하고 있기 때문에,이 호출은 지극히 동적 인 호출됩니다. 물론 alloc 또는 new 메시지를 보내 클래스 객체 인스턴스를 만들 수 있습니다. 변수를 교체만으로 호출 클래스 메소드 나 생성하는 인스턴스를 변경할 수 있으므로 유연한 프로그램을 제공하는 데 사용할 수 있습니다.