상속과 다형성이란 무엇일까
안녕하세요 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++ 에서 뿐만 아니라 여러 언어에선 가상 함수같은 개념을 지원 합니다.
바로 이 다형성을 위해서 입니다. 부모 클레스를 이용하여 자식 클레스를 가르킬때 부모 클레스에는 없는 메서드 ( 함수)가 자식 클레스에 정의 되어 있다면 그 메서드는 선언되어 있지 않다고 오류를 뿜게 됩니다. 그렇다고 해서 선언만 하게 되면 부모 클레스의 그 함수 ( 메서드 ) 가 실행이 되게 되죠 이를 위해 존재하는 것이 가상 함수입니다.
이는 추후 자세히 다뤄보도록 하고
조금은 난해하면서 그래도 나름 생각 정리해서 쓴 포스팅 마치겠습니다.