인스턴스 변수와 인스턴스 메소드는 인스턴스가 존재하지 않으면 호출 할 수 없습니다. 이들은 인스턴스와 관련된 메모리가 개별적으로 할당되기 때문에 당연한 것입니다.
클래스 메소드는 반대로 인스턴스에 관계없이 클래스 자체에 직결하고있는 메소드입니다. 메소드는 인스턴스와 관련이 없기 때문에 사실상 글로벌 함수와 동일합니다. 다른 것은, 호출 할 때 메시지 식을 사용하여 메시지를 통해 호출 할 필요가 있다는 점입니다.
클래스 메소드를 선언하는 것은 메소드를 선언 할 때 지정했던 빼기 기호 -를 더하기 기호 +로 교체만으로 후에는 인스턴스 메소드와 같습니다. 다만, 클래스 메소드는 인스턴스가 존재하지 않기 때문에 암시 적 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에는 클래스 변수는 존재하지 않습니다. 그 클래스의 모든 인스턴스가 공유하는 변수라는 것이 원하는 경우 클래스를 선언하는 헤더 파일 내에 파일 스코프의 글로벌 변수를 제공하고이 글로벌 변수를 인스턴스 메소드 등에서 액세스하는 형태로 클래스 변수를 실현 합니다.