클래스에 메소드를 추가한다

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("몸은 검으로 되어있다\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 클래스에 새로운 카테고리를 추가하고 있습니다. 덧붙여서, 카테고리의 메소드가 기존 클래스의 메소드와 충돌했을 경우, 카테고리의 메소드가 우선되어 기존의 메소드는 은폐 되어 버립니다. 계승에 의한 오버라이드(override)와는 다르기 위해, 은폐 된 메소드를 호출하는 수단이 없어져 버릴테니 주의해 주세요.

Posted by tklee