메서드의 내부 표현
Objective-C 컴파일러는 메서드를 컴파일 할 때 식별할 수 있는 이름의 내부 표현으로 변환합니다. 이 메서드의 내부 표현을 셀렉터라고 하며 메시지를 보내고 받는 것은 실제로 셀렉터가 교환되는 것입니다. 메서드를 식별하기 위한 내부 표현에 대해서는 컴파일러가 처리해야하는 문제이며, 개발자가 알아야 하는 영역이 아닙니다. 개발자에게 중요한 것은,이 셀렉터를 SEL 형식으로 취급한다는 사실 뿐입니다.
메서드가 내부적으로 어떤 데이터로 변환되고, 어떻게 식별하는지 등의 문제는 몰라도 됩니다. 그러나, 내부적으로 Objective-C는이 내부 표현을 SEL 형식의 변수로 취급하고 있습니다. 즉, SEL 형식의 변수는 메서드 이름을 식별하기 위해 컴파일러가 할당한 특수 코드를 저장할 수 있다는 것입니다.
메서드를 @selector 컴파일러 지시어를 사용하여 검색할 수 있습니다.
@selector (method)
method는 검색하고 싶은 메서드의 이름을 지정합니다. 지정된 메서드의 이름이 있는지 여부는 메서드를 호출할 때인 런타임에 결정되기 때문에 컴파일 타임에는 에러가 발생하지 않을 것입니다.
셀렉터에서 얻은 값을 SEL 형식의 변수에 저장 했다고 해서, 이것을 어떻게 사용할 수 있는 것입니까?. 셀렉터는 메서드를 식별할 수 있는 성질이 있으므로, 역시 최고의 이용 방법은 함수에 대한 포인터인지 동적 메서드 인지를 구별할 경우입니다. 셀렉터에서 메서드를 식별하는 기능을 제공하는 것은 루트 클래스입니다.
Object 클래스에는 SEL 형식의 값을 받는 perform 메소드가 선언되어 있습니다. 이 메서드는 인수로 받은 셀렉터에서 특정 메서드를 실행합니다.
- perform : (SEL) aSel;
- perform : (SEL) aSel with : anObject;
- perform : (SEL) aSel with : anObject1 with : anObject2;
aSel에 호출할 메서드의 선택입니다. anObject, anObject1, anObject2에는 메서드에 전달되는 인수를 지정할 수 있습니다.
#import <stdio.h>
#import <objc/Object.h>
@interface Test : Object
- (void) Write;
@end
@implementation Test
- (void) Write
{
printf ( "I am the bone of my sword. \n");
}
@end
int main()
{
id obj;
SEL method;
obj = [Test new];
method = @selector (Write);
[obj perform : method];
return 0;
}