클래스에 직결한 메소드

인스턴스 변수나 인스턴스 메소드는, 인스턴스가 존재하지 않으면 호출할 수 없습니다. 이것들은, 인스턴스에 관련된 메모리를 개별적으로 할당할 수 있기 위해 당연한 일입니다.

클래스 메소드는, 반대로 인스턴스에는 관계없이, 클래스 그 자체에 직결하고 있는 메소드입니다. 메소드는 인스턴스와 관련하고 있지 않기 때문에, 사실상 글로벌 함수랑 다름이 없습니다. 다른 점은, 호출할 때 메세지를 사용하고 메세지를 개입시켜 호출할 필요가 있는 점입니다.

클래스 메소드를 선언하는 것은, 메소드의 선언시로 지정하고 있던 마이너스 기호 - 가 플러스 기호 + 로 바뀌는것 외에 인스턴스 메소드와 같습니다. 다만, 클래스 메소드에는 인스턴스가 존재하지 않기 때문에, 암묵의 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 메소드, 정적인 메소드라고 표현하는 것이 알기 쉬울 것입니다.

실은, Objective-C 에는 클래스 변수는 존재하지 않습니다. 그 클래스의 모든 인스턴스가 공유하는 변수라는 것을 갖고 싶은 경우, 클래스를 선언하는 헤더 파일내에 파일 스코프의 글로벌 변수를 준비해, 이 글로벌 변수를 인스턴스 메소드등에서 액세스 한다고 하는 형태로 클래스 변수를 실현합니다.

Posted by tklee