2011. 6. 9. 12:31

클래스에 메서드를 추가하려면

 Objective-C 클래스를 여러 파일로 분할하여 선언 정의할 있는 기능을 제공하고 있습니다.  이것을 카테고리라고 부르며, 카테고리를 사용하면 클래스의 메서드 선언을 분산시킬 있습니다.  예를 들면, 여러 개발자가 공동으로 동시에 동일한 클래스를 구현할 경우 개발자는 클래스 개발자가 담당하는 메소드를 카테고리를 사용하여 분류하여 개발 있습니다.

 카테고리를 선언하려면 반드시 기본이 되는 클래스의 인터페이스 선언이 필요합니다. 클래스의 카테고리를 선언 정의하려면 다음과 같은 구문을 지정합니다.

 

 @interfae 클래스 이름 (카테고리 ) {...

 @implementation 클래스 이름 (카테고리 ) {...

 

여기서 지정한 카테고리 이름은 C언어 식별자 명명 규칙을 따릅니다.  카테고리화하는 클래스는 반드시 기본이 되는 본체를 선언해야 합니다.

 카테고리는 일반 클래스의 선언 정의와 비슷하지만, 인스턴스 변수를 선언할 없기 때문에 주의 하십시오.  카테고리에서 선언할 있는 것은 인스턴스 메서드와 클래스 메서드 뿐입니다.

 #import <stdio.h>

 #import <objc/Object.h>

 

 @interface Test : Object

 - (void) WriteA;

 @end

 

 @interface Test (Fate)

 - (void) WriteB;

 @end

 

 @implementation Test

-   (void) WriteA

 {

  printf ( "I am the bone of my sword. \n");

 }

 @end

 

 @implementation Test (Fate)

-   (void) WriteB

 {

  printf ( "I am the bone of my sword. \n");

 }

 @end

 

 int main()

{

 id obj = [Test new];

 [obj WriteA];

 [obj WriteB];

 [obj free];

 

 return 0;

}

  프로그램은 Test 클래스를 기반으로 하는 Fate라는 이름의 카테고리를 구현하고 있습니다.  실행 결과는 생각한 것과 같습니다.  Test 클래스에서 분할된 모든 카테고리는 궁극적으로 동일한 클래스로 통합되게 됩니다.  물론 카테고리는 다른 파일에서 선언해도 상관 없습니다. 그럴 경우, 카테고리를 선언하는 파일은 기본이 되는 클래스를 선언하는 헤더 파일을 포함하고 있어야 합니다.

 카테고리는 이미 완성된 클래스에 기능을 추가하는 용도로 사용할 수도 있습니다.  그러나 인스턴스 변수를 추가 수는 없기 때문에 존재하는 클래스의 기능 확장용이라고 생각하면 됩니다.

 #import <stdio.h>

 #import <objc/Object.h>

 

 @interface Object (Write)

-   (void) Write;

 @end

 @implementation Object (Write)

-   (void) Write

 {

 printf ( "I am the bone of my sword \n ");

 }

 @end

 int main()

{

 id obj = [Object new];

 [obj Write];

 [obj free];

 return 0;

}

  프로그램은 루트 클래스인 Object 클래스에 카테고리를 추가하고 있습니다.  덧붙여서, 카테고리 방법이 기존 클래스의 메소드와 충돌할 경우, 카테고리의 메소드가 우선적으로 적용되며 기존 메서드는 무시됩니다.  상속에 의한 재정의와 다르기 때문에, 무시된 메서드를 호출할 수단이 없으므로 주의 하시기 바랍니다.
Posted by openserver