기능의 확장

객체 지향의 설계에서는, 한 번 작성된 시스템(클래스)는 재이용 가능해야 한다고 생각되고 있습니다. Objective-C에서 올바르게 설계된 클래스는, 간단하게 그 기능을 확장할 수 있습니다. 그것도, 자신이 만든 클래스에서던, 타인이 만든 클래스에서던 관계없이 이용할 수 있습니다.

우리는 지금까지 루트 클래스의 Object 클래스를 계승해 왔습니다만, 우리가 독자적으로 작성한 클래스를, 한층 더 다른 클래스에 계승시킬 수도 있습니다. 클래스를 계승할 때, 새롭게 생성되는 클래스를 서브 클래스라고 부르고, 계승원의 클래스를 슈퍼 클래스라고 부릅니다.

서브 클래스는 슈퍼 클래스의 기능을 그대로 계승하기 위해, 슈퍼 클래스에서 정의되고 있는 메소드를 이용할 수 있습니다. 이것에 덫붙혀, 필요한 기능을 한층 더 추가하는 것이 서브 클래스의 역할입니다.

#import <stdio.h>
#import <objc/Object.h>

@interface SuperClass : Object
- (void)methodA;
@end

@interface SubClass : SuperClass
-(void)methodB;
@end

@implementation SuperClass
- (void)methodA {
	printf("SuperClass.methodA\n");
}
@end

@implementation SubClass
- (void)methodB {
	printf("SubClass.methodB\n");
}
@end

int main() {
	id obj = [SubClass alloc];
	[obj methodA];
	[obj methodB];
	
	return 0;
}

이 프로그램으로 정의하고 있는 SubClass 클래스는 SuperClass 클래스를 계승하고 있습니다. 이 때, SubClass는 SuperClass 의 서브 클래스이며, SuperClass는 SubClass 의 슈퍼 클래스이다고 표현할 수 있습니다. SubClass는 SuperClass 의 기능을 계승하고 있기 때문에, SubClass의 인스턴스는 SuperClass 의 기능을 그대로 이용할 수 있습니다.

이 프로그램에서는, SuperClass의 methodA 메소드를, SubClass의 methodB 를 선언하고 있습니다. SubClass가 methodB 를 이용할 수 있는 것은 당연합니다만, main() 메소드의 코드를 보고 확인할 수 있듯이, SubClass 의 인스턴스는 슈퍼 클래스의 SuperClass에 선언된 methodA 를 호출할 수도 있습니다.

클래스의 인스턴스를 작성하기 위한 alloc 메소드는 선언하지 않고 호출할 수 있었습니다만, 이것도 Object 루트 클래스를 계승하고 있었기 때문에 이용할 수 있었습니다. 사실 Object 루트 클래스를 계승하지 않으면 alloc 메소드를 이용할 수 없습니다.

원문 http://wisdom.sakura.ne.jp/programming/objc/objc5.html
번역의 귀차니즘으로 번역기 돌린 후 원문과 대조하면서 어색한 부분만 재수정한겁니다.
어휘 사용에서 다소 어색한 부분이 있더라도 양해바랍니다.

Posted by tklee

댓글을 달아 주세요