클래스 메소드


클래스에 직결 한 메소드

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

클래스 메소드는 반대로 인스턴스에 관계없이 클래스 자체에 직결하고있는 메소드입니다. 메소드는 인스턴스와 관련이 없기 때문에 사실상 글로벌 함수와 동일합니다. 다른 것은, 호출 할 때 메시지 식을 사용하여 메시지를 통해 호출 할 필요가 있다는 점입니다.

클래스 메소드를 선언하는 것은 메소드를 선언 할 때 지정했던 빼기 기호 -를 더하기 기호 +로 교체만으로 후에는 인스턴스 메소드와 같습니다. 다만, 클래스 메소드는 인스턴스가 존재하지 않기 때문에 암시 적 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에는 클래스 변수는 존재하지 않습니다. 그 클래스의 모든 인스턴스가 공유하는 변수라는 것이 원하는 경우 클래스를 선언하는 헤더 파일 내에 파일 스코프의 글로벌 변수를 제공하고이 글로벌 변수를 인스턴스 메소드 등에서 액세스하는 형태로 클래스 변수를 실현 합니다.