2011. 6. 9. 12:29

클래스에 직접 구현된 메서드

 인스턴스 변수와 인스턴스 메서드는 인스턴스가 존재해야만 호출할 있습니다. 이들은 인스턴스와 관련된 메모리가 별도로 할당되기 때문에 당연한 것입니다.

 클래스 메서드는 반대로 인스턴스와 관계없이, 클래스 자체에 구현되어있는 메소드 입니다.  클래스 메서드는 인스턴스와 관련이 없기 때문에 사실상 전역 함수와 동일합니다.  호출할 메시지 식을 사용하여 메시지를 호출해야 하는 점도 동일합니다.

 클래스 메서드 선언은 메서드를 선언할 지정했던 빼기 - 기호를 더하기 기호 + 변경하면 되고 나머지는 인스턴스 메서드와 동일하게 사용합니다.  그러나 클래스 메서드는 인스턴스가 없으므로 암시적 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 openserver