상속


기능의 확장

객체 지향 설계에서 한 번 만든 시스템 (클래스)는 다시 사용할 수 있어야한다고 생각합니다. 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 메소드를 사용할 수 없습니다.