Objective-C 기초

상속

night-Ohl 2019. 2. 9. 15:51
반응형

클래스 상속 (inheritance)

상속을 통해 부모의 특성을 그대로 자식 클래스에서 사용할 수 있도록 함.

==> 자식 클래스에서는 부모 클래스의 멤버 변수, 메소드 등을 사용할 수 있음.


그래서 어떻게 사용되느냐?

==> 여러 클래스들의 공통적인 부분을 부모 클래스로 묶어놓고, 부모 클래스를 상속 받아서 필요한 부분만 재정의, 추가해서 사용.


예를 들면)

고양이, 오리, 염소 클래스를 만들고 각각의 울음소리를 출력하고자 할 때, 소리만 다를 뿐 '울음소리를 출력한다'라는 기본 틀은 동일함에도, 상속이라는 개념을 사용하지 않는다면 똑같은 함수를 각각의 클래스에 개별적으로 다 만들어야함.


==> '동물'이라는 부모 클래스를 만들고 '울음소리'라는 메소드를 정의하고,

==> 자식 클래스에서는 부모를 상속받아 필요한 부분만  재정의, 추가 하여 사용.


[ 동물 ]

동물 -- 부모 클래스가 될 놈

울음소리("동물의 울음소리를 출력합니다");

몸_길이

서식지

먹이

천적


클래스 선언부 ( Animal.h )

#import <Foundation/Foundation.h>


@interface Animal : NSObject

-(void)울음소리; //인스턴스 메소드 선언

@property int bodyLength;

@property NSString *habitat;

@property NSString *feed;

@property NSString *naturalEnemy;

@end

클래스 구현부 ( Animal.m )

#import "Animal.h"


@implementation Animal

-(void)울음소리{ //인스턴스 메소드 구현

    NSLog(@"동물의 울음소리를 출력합니다.");

}

@end



[ 고양이 ]

고양이 : 동물 - 상속

울음소리("야옹"); - 재정의


클래스 선언부 ( Cat.h )

#import "Animal.h"


@interface Cat : Animal //Animal 클래스를 상속받습니다! 라는 뜻.


@end


클래스 구현부 ( Cat.m )

#import "Cat.h"


@implementation Cat

-(void)울음소리{

    NSLog(@"야옹~!");

}

@end



[ 양 ]

양 : 동물 - 상속

울음소리("메에에"); - 재정의


클래스 선언부 ( Sheep.h )

#import "Animal.h"


@interface Sheep : Animal //Animal 클래스를 상속받습니다! 라는 뜻.


@end


클래스 구현부 ( Sheep.m )

#import "Sheep.h"


@implementation Sheep

-(void)울음소리{

    NSLog(@"메에에~");

}

@end




실행코드 ( main.m )


#import <Foundation/Foundation.h>

//#import "Animal.h"

#import "Cat.h"

#import "Sheep.h"

int main(int argc, const char * argv[]) {

    @autoreleasepool {

        //객체 생성

        Cat *my_cat = [[Cat alloc] init];

        //멤버 변수 값 삽입

        my_cat.bodyLength = 130;

        my_cat.habitat = @"어디에나";

        my_cat.feed = @"캔";

        my_cat.naturalEnemy = @"친척동생";

        //인스턴스 메소드 호출

        [my_cat 울음소리];

        

        //객체 생성

        Sheep *your_sheep = [[Sheep alloc] init ];

        //멤버 변수 값 삽입

        your_sheep.bodyLength = 90;

        your_sheep.habitat = @"highland";

        your_sheep.feed = @"풀";

        your_sheep.naturalEnemy = @"늑대";

        //인스턴스 메소드 호출

        [your_sheep 울음소리];

    }

    return 0;

}


==> 결과 :

2019-02-19 16:41:36.094045+0900 learn[3057:977837] 야옹~!

2019-02-19 16:41:36.094363+0900 learn[3057:977837] 메에에~

Program ended with exit code: 0

==> 부모 클래스에서 그대로 써도 되는 변수(신장 길이, 서식지, 먹이, 천적)은 그대로 사용하고 / 

==> 울음소리를 출력하는 메소드는 재정의 하여 사용.


장점 : 어떠한 부모 클래스를 상속받아 사용하는 객체 하나를 알면, 그 부모 클래스를 상속받는 다른 클래스들의 구조도 어느정도 파악이 되고 어떤 메소드를 호출했을 때 어떤 행위를 할 지도 쉽게 추측 가능하다. 또한 코드의 간결성과 가독성도 좋아짐.


정리 : 부모 클래스로 갈 수록 큰 틀만 잡고, 자식 클래스로 갈 수록 점점 내용이 구체화됨.

반응형

'Objective-C 기초' 카테고리의 다른 글

URL Encoding  (0) 2019.02.14
==  (0) 2019.02.09
인스턴스 메소드 & 클래스 메소드  (0) 2019.02.09
클래스 작성  (0) 2019.02.08
nil 포인터  (0) 2019.02.08