카테고리
카테고리 (Categories)
Object Pascal의 클래스 헬퍼(class helper)와 비슷하게, Objective-C에는 카테고리(Category)가 있어요. 카테고리는 실제로 클래스의 하위 클래스를 만들지 않고도 클래스를 확장하게 해줘요. 다만 Objective-C 카테고리는 클래스 헬퍼보다 더 많은 기능을 제공한답니다.
본문
클래스 헬퍼와의 차이를 정리해 볼게요.
- Object Pascal에서는 도우미 클래스 하나만 스코프에 있을 수 있어요(마지막 것이 우선). Objective-C에서는 특정 클래스에 대해 여러 카테고리를 동시에 스코프에 둘 수 있어요.
- Object Pascal에서 헬퍼 메서드는 원래 클래스에 있는 기존 메서드를 바꿀 수 없어요(숨길 수는 있지만). Objective-C의 카테고리는 새 메서드를 추가하는 것뿐 아니라 다른 클래스의 기존 메서드를 대체할 수도 있어요. Objective-C에서는 모든 메서드가 가상이므로, 이 말은 즉 메서드가 대체된 클래스에서 상속받는 모든 클래스에 대해(그들이 override하지 않는 한) 그 메서드가 바뀐다는 뜻이에요.
- Object Pascal 헬퍼는 기존 클래스에 인터페이스를 추가하는 데 쓸 수 없어요. 반면 Objective-C 카테고리는 프로토콜을 구현할 수도 있어요.
Objective-C 카테고리의 정의는 프로토콜 정의와 아주 비슷하며, objccategory 키워드로 시작해요.
외부에서 정의된 카테고리에는 별칭을 지정할 수 있다는 점도 다시 눈여겨보세요. Objective-C 2.0은 빈 카테고리 이름을 허용해요. 그리고 기존 메서드를 대체할 때는 새 메서드를 추가하는 대신 reintroduce 수식어를 써야 한다는 점도 중요해요.
메서드를 대체할 때 inherited를 호출하면, 원래 클래스의 그 메서드가 아니라 부모 클래스의 해당 메서드 구현이 호출돼요.
카테고리 정의의 예시를 볼게요.
MyProtocol = objcprotocol
procedure protocolmethod; message 'protocolmethod';
end;
MyCategory = objccategory(NSObject,MyProtocol)
function hash: cuint; reintroduce;
procedure protocolmethod; // from MyProtocol.
class procedure newmethod; message 'newmethod';
end;
이 선언은 NSObject에서 상속받는 모든 클래스의 Hash 메서드를 대체한다는 점을 기억하세요(그 클래스가 직접 override하지 않는 한).
더 알아보기
- 클래스 확장의 다른 접근으로 프로토콜 정의를 함께 보면 좋아요.
objccategory문법은 Objective-C 클래스 선언 섹션의 문법 다이어그램과 맞물려요.