본문 바로가기

기타/객체지향의 탄생(2013)

객체지향의 탄생-상속과 폴리모피즘

 

  1. 상속과 폴리모피즘

상속에 대하여 생각해보면, 부모의 재산을 물려 받는 것도 상속이고, 스승으로부터 기술을 전수 받는 것도 일종의 상속이다. 한창 프로그래밍에 관심이 많을 때 나는 부모의 재산을 물려받은 재벌2세보다 훌륭한 맨토를 만나 소중한 기술과 삶의 지혜를 배우길 더 바랬다.

 

부모의 재산을 물려받은 재벌2세는 부모가 낚은 고기를 그대로 물려준것에 불과하다. 맨토의 지식을 물려받은 제자는 고기를 잘 낚는 법을 배우는 것이다. 고기를 잘 낚는 법을 배운 제자가 더 자부심이 클 것이기 때문에 나는 훌륭한 맨토를 만나기를 더 바랐다.

 

지금도 나는 훌륭한 맨토를 만나고 싶은 열망이 많지만, 사실 나이가 들고 사회생활을 하다보니 역시 부모 재산의 혜택을 입은 부자2세들이 더 부럽기도 하다. 이렇게 변한 나를 볼때마다 내가 다시 배움의 열정이 있었던 옛날로 돌아갈수 있도록 나와 사회가 좀더 나아지길 바랐다.

 

 

객체지향 대부분의 장점은 상속과 폴리모피즘으로부터 출발한다. C등의 절차지향 개념을 공부한 사람이 처음 상속과 폴리모피즘 개념을 배울때도, 난생 처음 프로그래밍을 배우는 사람도, 상속과 폴리모피즘 개념을 이해하는데 어려움을 표시한다.

 

결국 누구는 역시 절차지향이 맞아~하며 다시 익숙한 방식의 절차지향 프로그래밍으로 돌아가거나, 상속과 폴리모피즘 개념을 이해하지 않은체 객체지향 언어지만 절차지향적으로 프로그래밍을 한다.

 

그러나 상속과 폴리모피즘은 마치 대한민국 젊은 남자의 군대생활처럼 싫지만 반드시 거쳐야 하고 반드시 이해해야 하는 수련 과정이다.

 

상속은, 스승과 제자사이와 비슷하다. 스승은 제자에게 자신의 모든 기술을 전수한다. 제자는 스승의 기술을 고스란히 체득한다. 또는 스승의 기술을 완전히 습득하기 전까지는 스승의 힘을 빌린다. 스승은 제자가 자신의 기술을 아무 생각 없이 그대로 받아들이는 것은 싫어한다. 제자가 자신의 특성에 맞게 기술을 재탄생 시키길 바란다.

 

 

 

처음 객체지향을 배웠을 때 나뿐만 아니라 동기들도 다른건 다 몰라도 상속만큼은 그나마 조금은 이해을 했다. 객체지향에서 가장 대중적인 개념이고 상속의 정의가 다른 객체지향 정의처럼 어렵게 돌려말하지 않고 꽤 직관적으로 설명되었기 때문인 것 같다.

 

상속의 정의는 부모 클래스의 기능을 자식 클래스가 물려받는 것이다. 자식 클래스가 부모 클래스를 상속받으면 private속성과 메소드를 제외한 부모 클래스의 모든 속성과 기능을 물려받는다.

 

부모 클래스의 속성과 기능을 물려받는 상속을 통해 다음의 이로운 효과를 얻는다.

1. 자식 클래스는 부모 클래스의 속성과 기능을 중복 코딩할 필요 없이 그대로 사용한다. 그래서 소스가 깔끔해지고 개발이 편리해진다.

 

2. 부모 클래스의 기능을 자신의 특성에 맞게 재정의(=오버라이드) 한다. 같은 객체 그룹이지만 해당 객체 고유 특징에 맞게 메소드 안의 로직을 다르게 구현할 수 있다.

 

3. 오버라이드는 폴리모피즘(=다형성)이란 객체지향 요소를 지원한다. 폴리모피즘은 '상속과 구성' 구조 및 디자인 패턴에서 유익하게 쓰인다.

 

상속으로 중복 코딩을 피하는 방법을 써먹는 것은 직관적이라 쉽게 써먹지만 눈앞의 효과만 생각한 것이다. 그러나 상속에 숨겨진 오버라이드와 폴리모피즘 효과를 이해하고 사용한다면 그때서야 제대로 객체지향을 보는 눈을 갖기 시작하는 것이다.

 

[상속과 오버라이드등의 관련 요소 설명]

 

선물은 사람과 사람사이를 부드럽게 만들어준다. 주는 사람은 배푸는 즐거움, 받는 사람은 풍요의 즐거움을 누린다. 나는 어렸을때는 그냥 받는 즐거움만 알았지만 나이가 들어가니 주는 즐거움도 조금씩 알아 간다. 나중에 내가 늙어 산타클로스 분장을 하고 어린이들에게 배푸는 멋진 할아버지가 되는 상상도 한다.

 

선물이 사람들을 즐겁게 해주는 이유는 선물의 겉이 포장되어 선물 내용이 무엇인지 알기 어렵기 때문이다. 선물 주는 사람은 포장지를 뜯었을 때 상대방의 반응을 기대하는 즐거움이 있고, 선물을 받는 사람은 설레임을 더 느낄수 있다.

 

폴리모피즘(=다형성)은, '신비로운' 산타클로스 할아버지의 '비밀스런' 선물 효과와 같다. 어린이는 매년 12월25일마다 산타 할아버지의 선물을 기다린다. 어리이는 그 선물이 어떤 선물인지 알아서는 안된다. 어떤 선물이든 어린이는 선물을 받고, 그 선물의 포장지를 뜯고, 그 선물을 쓰면 된다. 그러나 만약 어린이가 산타 할아버지의 실체를 알고, 선물이 무엇인지도 알게 된다면 '어린이의 동심'은 건조해질 것이다.

 

 

폴리모피즘이란, '같은 종류의 여러 객체'에게 '동일한 메시지'를 주었을 때 '각자 다르게 행동'하는 것이다. 예를 들어 '노트북 객체 그룹'에 맥북, 센스노트북, HP노트북이 있고, 이 노트북에 '부팅' 이라는 메시지를 보냈을 때 맥북, 센스, HP 노트북이 각자 다른 방식으로 부팅하는 것을 생각한다.

 

 

맥북, 센스, HP 노트북처럼 '같은 종류의 여러 객체'는, '같은 종류의 객체중 부모 클래스'가 제공하는 '부팅' 같은 '같은 기능'을, '저마다의 기능으로 재정의(=오버라이드)' 한 상태이다.

 

이 '객체 그룹'을 쓰는 '클라이언트 객체'는, '객체 그룹'의 '부모 클래스'만 알고 있다. '클라이언트 객체'가 '부모 클래스'만 알고 있는 상태에서, 이 '클라이언트 객체'를 실행하는 '실행 클래스'는 '클라이언트 객체' 중에 '같은 기능'이지만 '각자 다르게 행동'하는 '자식 클래스'중 하나를 '인자'로 넘겨준다. '클라이언트 객체'는 자신이 '인자'로 받은 '객체 클래스'를 모른다. 그냥 실행할 뿐이다. 이것이 폴리모피즘의 작동 구조이다.

 

[계속하여 반복 등장하는 전형적인 상속과 폴리모피즘 구성도, 객체지향 보물지도]

 

상속을 통해 부모 클래스와 자식 클래스가 생겼고, 오버라이드를 통해 부모 클래스의 기능을 저마다의 특성에 맞게 재정의 했고, 상속과 오버라이드의 요소를 활용해 폴리모피즘 기능이 작동한다. 이 모든 기능이 조화롭게 작동한다면, 저마다의 다양한 기능을 가진 '자식 클래스'를 자유롭게 교체하고, 새로운 기능을 쉽게 확장 할 수 있다. 그래서 응집도는 높고 결합도는 낮아진다. 유연하고 확장성이 높고 유지보수하기 편하다는 다양한 수식어를 객체지향 개발에 붙일 수가 있다.

 

덧 ) 이 객체지향의 탄생 원고는 제가 책으로 내려다가 일단 잘 안되었는데요. 이유는 비문이 많다. 단락내 주제가 중복된다. 어떤 상황 설명을 과장한다.등 입니다. 그래도 원고를 일단 블로그에 몽땅 풀어보고 언젠가 제대로 교정해서 다시 도전할 생각입니다. 비문이 많다. 단락내 주제가 중복된다. 어떤 상황 설명을 과장한다. 이점을 감안해서 읽고 객체지향을 이해하는데 도움이 되셨으면 좋겠습니다. 의견도 주셨으면 좋겠습니다. 원고 조금만 교정하면 괜찮을것 같은 출판사 관계자분의 피드백도 환영합니다. 특별한 일 없으면 매주 월수 발행 예정입니다.