기능 확장
객체 지향 설계는 한번 만들어진 시스템 (클래스)은 다시 사용할 수 있어야 한다고 생각합니다. 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 인스턴스는 슈퍼 클래스에서 선언된 methodA를 호출할 수 있는 것입니다.
클래스의 인스턴스를 만드는 alloc 메소드는 선언하지 않고도 호출할 수 있었던 것은, Object 루트 클래스를 상속하고 있었기 때문에 사용할 수 있었습니다. 사실 Object 루트 클래스를 상속해야만 alloc 메소드를 사용할 수 있는 것입니다.