컴퓨터/C++

상속과 다형성이란 무엇일까

sdk 2015. 11. 1. 03:19

안녕하세요 sdk입니다

오늘 포스팅에선 객체지향 언어를 다루다 보면 반드시 등장하게 되는 용어인

상속 과 다형성 에 대하여 다뤄 보도록 할것인데요

우선적으로 제가 이해한대로 서술하는것 이기 때문에 재대로 전달이 안될수도 있습니다.


상속을 이야기 하기전에 클레스에 대하여 이야기해볼것인데요

절차지향 언어인 C ( 뭐 기타등등 ) 언어를 하시다가

객체지향 언어인 C++을 하시면서 의문점이 꾀 많으셧을것 입니다.

과연 절차지향적인 언어와 다를게 무엇이냐

였을것 입니다. 

작지만 아주 큰 다른 하나가 있죠

바로 프로그램이 클레스 단위로 구성되고 만들어져서 동작한다는 것 입니다.

클레스들을 바로 객체 라고 하며

이것들을 이용해 구조적인 프로그램을 만드는것을 객체지향적 프로그래밍 이라고 할 수 있습니다.


상속에 대하여 다뤄볼까 합니다.

우선적으로 이번 포스팅에선 C++만의 상속과 관련된 자세한 설명은 하지 않도록 하겠습니다.

 상속이란 무엇일까요?

단어 상속의 사전적 정의를 봅시다.

상속

명사

1 .를 이음.
    2 .<법률> 일정한 친족 관계가 있는 사람 사이에서,  사람이 사망한 에 다른 사람에게 재산에 관한 권리와 의무의 일체를 이어 주거나다른 사람이 사망한 사람으로부터 권리와 의무의 일체를 이어받는 .

    이라고 네이버는 말해주고 있습니다.

     1번 뒤를 이음 2번 뭘 어쩌고 저쩌고를 ' 이어 받는다 ' 라고 합니다.

    이부분이 중요합니다. 이어 받는다 , 혹은 뒤를 잇는다 포함한다 뭐 한다

    다 맞는 말 입니다.

    어떤 클레스 A 가 있습니다. 이 클레스에는 사람 이라는 정보가 들어 있군요.

    그리고 클레스 B가 있습니다. 이번엔 이 클레스엔 생물 이라는 정보가 들어있습니다.

     사람은 생물 이라는 정보를 가지고 있습니다.

    즉 상속이죠

    C++에선 위를

    A : B 라고 표기 합니다

    A(사람) : ( 상속 기호 ) B( 생물 )

    이렇게요

    이것으로 상속은 다 설명했습니다.

    물론 간략하게 긴 하지만 말이죠.

    조금더 짧게 말하자면

    어떤 클레스에 속성 , 정보 , 기타 등등을 " 포함 " 하고 싶을때 상속을 사용하는 것 입니다.

    주의 해야할 점은

    3개 이상의 클레스를 상속할 때 무한 루프마냥 상속한 클레스를 또 상속한다거나

    A : B

    B : C

    C : A 이런식으로 되버리면 프로그램이 꼬이다 못해서 망하게 되는 경우가 많으니 주의해 주세요.

    또한 상속은 객체지향의 5대 원칙 (SOLID)를 이야기하는 가장 기본적인 단위가 되기도 합니다 ( 추후 포스팅 하겠습니다 ) 


     이번엔 다형성에 대하여 서술 하도록 하겠습니다

    좀더 설명하기 전에 한문장으로 설명하자면

    다형성은 상위 클레스 타입의 참조 , 포인터 등을 이용해 그 자식 클레스를 참조할 수 있는 것을 말합니다.


     조금더 이야기 해보자면 위에서 설명했듯이 상속은 어떤 속성이나 정보 기타등등을 포함 하여 표현할때 사용합니다.

    한가지 예를 들겠습니다

    " 사과 " 라는 클레스가 있습니다

    " 과일 " 이라는 클레스도 있습니다

    사과 : 과일 이겠죠?

    자 위 상속 관계를 한 문장으로 쓸 수 있습니다.

    사과는 과일이다.

    사과 is a 과일 그 유명한 is a 원칙 입니다. 

    따라서 

     " 여기에 놓여있던 과일 누가 가져갔어! " 

     " 여기에 놓여있던  ( 과일인 ) 사과 누가 가져갔어! " 


    과일인 부분에 사과를 덧붙여 쓸 수 있게 되는 것 입니다.
    물론 문장상에선 반대로도 가능하지만 프로그래밍 상에선 절대 불가능 하니 참고 해주세요.
    이어서 설명해 보자면
    위에서 보인 문장은

     과일 변수 = 사과 객체

    이것을 표현한 것 이기도 합니다.

    즉 사과 is a 과일 의 법칙을 위배하지 않죠

    반대로 과일 is a 사과 는 맞을까요? 과일은 사과다? 이건 아니니까 반대는 안되는 것 입니다

    프로그래밍세계에서도 똑같습니다. 다형성을 생각할때 이것만 명심합시다. 사과는 과일이다. 즉 IS A 법 칙 입니다.


    참고로 C++ 에서 뿐만 아니라 여러 언어에선 가상 함수같은 개념을 지원 합니다.

    바로 이 다형성을 위해서 입니다. 부모 클레스를 이용하여 자식 클레스를 가르킬때 부모 클레스에는 없는 메서드 ( 함수)가 자식 클레스에 정의 되어 있다면 그 메서드는 선언되어 있지 않다고 오류를 뿜게 됩니다. 그렇다고 해서 선언만 하게 되면 부모 클레스의 그 함수 ( 메서드 ) 가 실행이 되게 되죠 이를 위해 존재하는 것이 가상 함수입니다.

    이는 추후 자세히 다뤄보도록 하고 

    조금은 난해하면서 그래도 나름 생각 정리해서 쓴 포스팅 마치겠습니다.




    여러분들의 댓글은 큰 힘이됩니다 :)