본문 바로가기

프로그래밍/기타

# 플밍지기와 함께하는 객체 지향 # - 4

플밍지기 자바 강좌

- 객체지향 : 다형성 -

 


 안녕하세염.. ^^ 방가버요~ 정말 오랜만에 강좌 게시판에서 함께하는 자바 회원님들을 만나뵙는 것 같아요. ^^ 근 9달만에 객체지향~ 그것도 꼴랑 4번에 걸쳐서 올리는 것을 이제야 마무리를 짓게 되네요. ^^ 얼마나 많은 분들에게 도움이 될런지 혹은 시간만 뺏는 건 아닐지 모르겠네요. ^^ 어쨌든 스스로의 약속과 회원님들과 한 약속(이것도 뭐 혼자서 한 약속이지만.. -.-; )을 지키기 해서~ 이제 객체지향의 마물 강좌를 올립니다.


 사실 객체지향이란 녀석을 대충보고 넘어가면 정말 아무것도 아닌 것 같지만, 나중에 돌아보면 이 녀석땜에 발목을 잡힐 수도 있는 심오한 녀석이닝~~ 관심가지고 잘 알아두셔야 할 것 같습니다~ 그럼 이제 함 손가락을 풀어볼까요? ^^


다형성이 우선 뭘까여? 웅. 다양한 형태를 가지고 있는 성질 정도가 될라나여? 뭐 아님 말구여..


저는 운전면허가 없지만.. 차가 무척 가지고 싶어요.. 뭐 예전엔 차 같은건 별로 관심도 없었는데.. 현재 근무하는 곳의 위치가 위치이다 보니까여.. 할튼 차가 가지고 싶어요.. 구래서 무슨 차가 있나했더니..  웅 테러칸, 무쏭, 코난도 뭐 이런차가 있네여.  아무래도 산 꼭대기이다보니.. 힘 좋은 차가.. -.-;

 어쨌든 가령 제가 지금 운전면허 시험장을 갔습니다. 생각해보니 역시 아무래도 운전면허가 있어야 하니까요. 하핫.. 운전면허 셤장에 도착하니 눈에 익은 노란차들이 있네염..  아구 아구.. 이리저리.. 힘들게 해서.. 아싸리.. 겨우 면허를 땄어염.. (뭐 가상이니깐 대충해염... )

 아.. 이제 차를 사려공.. 차 파는 곳에 갔죠.. 시승을 해서 고를 수 있다네요.. 테러칸, 무쏭, 코난도 하나씩 다 타봤어여.. 근데 운전면허학원에서 배우던거랑은 차가 좀씩 다 다르네여.. 역시.. 뭐 그래도 베스트 드라이버가 되기로 한.. 저로써는 무난히 다 차를 몰 수 있었지용.. 근데 신기하죵.. 분명히 차도 다 다른차공.. 회사도 다르고 막 그런데.. 다 운전을 할 수 있었어염..

 운전하는 방식이 뭐 똑같아서 그러겠지만요.. 근데. 분명 회사가 다르면. 차를 만드는 것도 다를텐데 어케 같이 돌아가죠? 희안하네여... 뭐 우리가 그런것 까지는 몰라도 차만 굴릴 수 있으면 되니깐 상관없겠죠?

  어쨌든 차를 사려고 하다가.. 생각해보니 돈이 없네여.. 차 판매원에게. 대략 난감한 미소를 지으면서 돌아왔죵.. 돌아오는 길에 하두 출출한데 딱~ 저기 따끈 따끈한 호빵이 있네여.. 오 달콤한 팥호빵부터, 맛난 야채호빵, 퓨전인 피자호빵, 고기호빵.. 아 그런데.. 생각해보니.. 요놈들도 모양은 다 똑같은데 참 속안에 든게 달라서.. 맛이 참 다르네요. 밑에 붙어있는 종이가 아녔음 먼지도 모르고 먹었을지도 모르겠네요..


 자 이제 다시 원래 주제로 돌아올까여? 헛소리가 넘 길어지면 안되니까여. ^^ 자. 우선 간단한 호빵을 생각해보죵. 호빵의 모양은 다 똑같죠.. 하지만 안쪽에 있는 속이 무엇이냐에 따라 맛이 달라지죵.

 바로 여기서 간단한 다형성의 개념을 막무가내로 끼워맞출 수 있죠. 같은 모양이지만 내부적으로 어떻게 처리가 되어있느냐에 따라서 전혀 다르게 처리한다는 거죠. 뭐 우리는 그런 내용을 알 필요는 없이 같은 방법으로 사용하면 되구요. (호빵이 무슨 맛이든 그냥 먹으면 되잖아여.. 맛나게 쩝)

 바로 여기서 호빵이란 외형은 똑같구요. 먹는 방법도 동일합니다. 동일한 모습과 동일한 방법으로 사용하는거지요.. 하지만 속에 무엇이 들어있느냐에 따라 전여 다른 맛이 나요.. 바로 내부가 어떻게 구현되어있는에 따라서 다른 일을 한다는 것이지요.

 즉, 요약해서 말하면 동일한 인터페이스를 지니고 사용자는 동일하게 사용하지만 내부적인 구현을 어떻게 했느냐에 따라서 행해지는 행위나 결과는 달라진다는 거죠.


 이제 이걸 처음 예로 들었던 자동차로 생각해서 다시 한 번 보죠.


마찬가지로 여러종류의 차가 있습니다. 위에서 말한  테러칸, 무쏭, 코난도를 포함한 뭐 네간자, 또 뭐가 있을까여? 어쨌든 그게 중요한게 아니니까요.. ㅋㅋ 중요한 건 다양한 종류의 차가 있습니다. 회사도 다르고 뭐 구동되는 방식도 다르고.. 다른 것이 많을 것입니다. 하지만, 그것을 다루는 방법은 거의 동일한 스펙으로 이뤄져있기 때문에 어떤 차든 무리 없이 운전할 수가 있죠.  여기서 우선 두 가지만 살펴보면, 운전하는 방법은 모두 동일합니다. 하지만, 내부적으로 엔진이 작동하고 어떻게 어떻게 굴러가는지는 차마다 다를 수 있습니다. 뭐 최소한 4륜구동으로 돌아간다던가 2륜구동으로 돌아간다던가 실제로 작동하는 형태를 다르지 않습니까? 다시 말하면 사용하는 인터페이스는 동일하지만, 실제로 작동되는 형태는 내부적으로 구현되어 있는 방식이 따라 다른 것입니다. 바로 이게 다형성이라고 볼 수 있는 것이지요. 사용하는 형태는 동일하지만, 내부적으로 구현되는 방식에 따라 다양한 결과를 가져올 수 있는 것이지요.

  근데 그게 뭐 어쨌다는거냐구요? 다시 한 번 생각해보자구요~ 다형성이란 걸 왜 쓰는지.. 이유를 모르면 왜 중요한지도 잘 모르니까요.. 가령, 삼송에서 만든차나, 헌대에서 만든차나, 썽용에서 만든차나, 혹은 외국계 훈다나, 각각의 회사마다 만드는 차의 운전 방법이 다르다고 생각해 보자구요. 그러면 운전면허도 삼송용 운전면허, 헌대용 운전면허 막 따로 있어야 하잖아요.. 그런 운전하는 방법을 동일한 일정한 스펙을 정해놓고 똑같이 만들면(바로 지금처럼..), 한 가지 방법만 알면 여러 가지를 다 운전할 수 있지용.. 구럼 편하겠죠? (뭐.. 현재는 이렇게 되어있으니깐 잘 모르겠지만... )

 가령 간단하게 다른 예를 하나 더 들어보면, 요즘에 리모콘 중에 통합 리모콘 있잖아요.. 이 전자제푸 저 전자제품.. 다 되는. 그것도 사용방법은 다 동일하죠? 볼륨 조절하고 채널바꾸고.. 그것도 동일한 스펙으로 만들어 놓고 내부에 동작하는 방법을 달리해서.. 이 티비, 저 티비, 막 티비 말고도 여러 가지 다 되는거죵.. 다형성의 개념이 적용된거라고 볼 수 있죠..

 다시 자동차로 넘어와서.. 그럼.. 그런 자동차를 운전하려면.. 뭐가 있어야 했죠? 예 바로 운전 면허증이죵. 웅 그게 일종의 스펙이라고 볼 수 있겠죠. 이러이러한 스펙이 있으면 그 스펙을 이용해서 필요에 따라 이 차, 저 차 운전할 수가 있는거죵..  차를 만드는 곳에서는 그 스펙에 맞추어서 차를 생산하면 누구에겐 차를 팔 수가 있구용.. 이걸 다시 말하면, 사용자 측면에서는 하나의 인터페이스를 가지고 다양한 기능을 하는 것을 다룰 수가 있다는거죠. 그리고 만드는 측면에서는 일정한 스펙만 지켜서 만들면 이곳 저곳에 팔아먹을 수 있다는거죠.. ^^

 가령 JDBC쪽에 보면 mysql이나, mssql, oracle 등등의 여러 가지 DB가 있는데, 일정한 스펙을 지켜서 그 회사들이 DB를 만들면, 우리는 그 DB에서 내부적으로 데이터 처리를 어떻게 하든지 쉽게 사용할 수가 있는거지요 사용하는 측면에서는 사용하기 편리하고 회사측에서 팔아먹을 수 있구 말이죵..

 자 그러한 점 말고 또 어떤 점이 있을까여? 다시 차로 돌아가서.. 예전에 나온 후라이드라는 차가 있스니다. 그런데 요즘 또 새롭게 업그레이드가 되어서.. 다시 출시되었더라구요. 뭐.. 망티즈라는 차도.. 첨에 출시되고 II도 나오공.. 또 같은 차여도.. 버전이 쫌씩 달라서.. 기능이 다르잖아요.. 하지만 사용자 측면에서는 똑같죠.. 즉 인터페이스는 변화가 없이 바로 구현되는 내부적인 것만 바꾸면 성능은 더 뛰어나게 된다는거죠.. 저 위에 예를 들었던 DB를 예를 들어봐도... 돈이 많은 m$에서. 열띠미 개발을 해서.. 쿼리를 던졌을 때 더 빨리 결과를 처리할 수 있는 방법을 연구해서 업그레이드를 했습니다. 하지만 사용자들은 업그레이드했다고 사용하는게 달라지는건 아니죠. 사용하는 건 똑같지만 내부적으로 처리되는건 좋아지는거죠..

  이 말들은 한마디로 요약하면.. 유지.보수에 좋다는거죠.. 인터페이스는 유지한채, 실 내부구현만 바꾸면 되니까요~^^



 자. 이제 한 번 정리를 해볼까요?



다형성은 보이는 것은 하나? 실제로 돌아가는 건 여러개? 하나의 인터페이스로 여러 가지 일을 할 수 있다는거죠 이 여러 가지 일은 어떻게 내부적으로 구현되어 있느냐에 따라 다르겠죠? ^^

 같은 말로 동일한 사용법으로 다양한 기능을 처리 할 수 있다는거죠..

 인터페이스와 구현부를 완전히 분리해서.. 구현부가 변경되어도 인터페이스는 유지되기 때문에 유지보수에 유리하고, 사용자와 제작자의 양쪽 입장에서도 모두 유리하죠. 사용하기 편하고, 팔아먹기 좋고~


 흐흠.. 대충 다 쓴거 같은데 참 마니 마니 부족한 내용인거 같네요 특히나 실제적으로 소스코드 측면에서는 전혀 접근하지 않았기 때문에 딱 와닿지 않을 수도 있을 것 같구요..  이 점으 어케할까 하다가.. 다음 강의는 객체지향 4부작(?)으로 다뤘던 걸.. 이번엔 소스코드 측면에서 다뤄보려고 합니다. 실제적인 에제 코드를 이용해서 직접 돌려볼 수도 있구요. 개념적인 것에서 코드 측면에서요. 뭐 제 실력이 아직 마니 부족하니깐.. 소스코드도 그다지 최적화되었다거나 어거지도 있을지도 모르겠네요. ^^ 하지만, 나름대로 열띠미 고심해 보겠습니다.

 4부작 객체지향 강의중. 가장 늦어졌지만.. 가장 부실한 것 같은데. 어떠셨을런지는 모르겠네요. 내용중이 이상하다거나, 부가내용 필요하신거 올려주시면 추가 내용 댓글로 업뎃 하겠습니다~ ^^

 그럼 다음 소스 코드 강좌때 보구요.. API 강좌도. 잘 보셨으면 좋겠구요~ ^^



                               플밍지기