클래스에 직접 구현된 메서드
인스턴스 변수와 인스턴스 메서드는 인스턴스가 존재해야만 호출할 수 있습니다. 이들은 인스턴스와 관련된 메모리가 별도로 할당되기 때문에 당연한 것입니다.
클래스 메서드는 반대로 인스턴스와 관계없이, 클래스 자체에 구현되어있는 메소드 입니다. 클래스 메서드는 인스턴스와 관련이 없기 때문에 사실상 전역 함수와 동일합니다. 호출할 때 메시지 식을 사용하여 메시지를 호출해야 하는 점도 동일합니다.
클래스 메서드 선언은 메서드를 선언할 때 지정했던 빼기 - 기호를 더하기 기호 +로 변경하면 되고 나머지는 인스턴스 메서드와 동일하게 사용합니다. 그러나 클래스 메서드는 인스턴스가 없으므로 암시적 self 객체를 사용할 수 없는 것도 당연합니다.
메시지 식에서 클래스 메서드를 호출하려면 인스턴스가 아니라 클래스 이름을 지정합니다. 지금까지 alloc 클래스 메소드를 사용해 왔으므로, 클래스 메서드를 호출하는 방법에 대해서는 궂이 설명이 필요는 없을 듯 합니다.
#import <stdio.h>
#import <objc/Object.h>
@interface Test : Object
+ (void) Write;
@end
@implementation Test
+ (void) Write
{
printf ( "I love you ... so please do not love me \n");
}
@end
int main()
{
[Test Write];
return 0;
}
이 프로그램은 Test 클래스를 선언하고 Write 메서드는 +가 지정되어 있기 때문에 클래스 메소드인 것을 확인할 수 있습니다. 클래스 메소드의 호출은 인스턴스가 필요하지 않으므로 main() 함수에서는 [Test Write] 형태로 클래스에 메시지를 보낼 수 있습니다.
클래스 변수
인스턴스 메서드에 대해 클래스 메소드가 존재하듯이 클래스 변수도 존재하면 괜찮다고 생각 할지도 모릅니다. Java 프로그래머 등은 static변수로 생각하는 편이 이해하기 쉬울 것입니다.