본문 바로가기

프로그래밍/기타

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

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


 3. 상속

  

  아구.. 간만입니다요~ ^^ 설날 연휴들은 잘 보내셨는지요? ^^

저도.. 잘 놀았답니다~ ^^ 혹시라도.. 제 강좌를 기다리시는 분이 한 분이라도 계셨을런지..

모르겠네요.. ^^;; 없으셔도.. 어쩔 수 없지만요.. 그래도.. 계셨다면.. 꼬리말~ 한 개정도..

남겨주시면.. 아... 감사하죠.. 눈물겹습니다....


 오늘은 객체지향의 세 번째 강좌인 상속에 대해서 살펴보겠습니다... 상속이 끝나면.

좀. 기나긴 다형성에 대해서 다루면서 객체 지향 강좌는 끝을 맺게 되겠죠. ^^

객체지향 내용이.. 서로 유기적으로 연관되어 있기 때문에.. 하나 하나... 잘 이해하시다가

보면... 그것들이.. 똘똘 뭉쳐서... 힘을 발휘한다는 것을 알 수 있게 될 것 같네요.. ^^


  자... 그럼.. 사설은 이 정도로 마치고.. 이제부터.. 본격적으로. 세 번째 강좌에 들어가도록

하겠습니다.. 자~~ 한 번 빠져 보시겠습니까? 자... 빠져 봅시다~~

 

  우선, 상속이라.. 뭐. 프로그램 공부를 하셨던 분이라면.. 상속... 아버지껄 가져다가 쓴다..

대략.. 이 정도가 되겠죠? ^^;; 뭐 프로그램을 전혀 모르셨던 분이라면.. 상속이라...

음 한 몫 단단히.. 챙겨서... 부자되는거? 흐흠.. 부모님 살아계실 때 잘해야죠! 무신 소리를..

우리 모두. 효도 합시다!!

 

  어쨌든.. 뭐... 우선은 아버지껄 가져다가 쓴다.. 맞습니다.. 조금 더.. 들어가면..

의 부모가 나에게 알려준 능력을.. 나는 쓸 수가 있다라는 것입니다... 왜냐면..

부모가 가지고 있는 능력이라해도. 자식에게 그 능력을 알려주지 않으면 쓸 수 없습니다.

물론이죠. 아무리.. 부모가.. 소매치기나.. 도적질을 해도.. 자식이 그러한 능력까지..

물려주고 싶겠습니까? 물론 아니겠죠.. 뭐.. 가끔.. 집 안 식구들이. 다같이 하는 경우도

있긴 하지만요.. ^^어쨌든..  상속이란 넘은... 부모가 허용한 내용을 자식이 가지고

있게 되는 것입니다..

 

  우선.. 허용한 내용이란 부분은.. 조금 후에 보도록 하구요.. 부모의 능력을...

쓸 수게 하는 것이라는.. 큰 관점에서 먼저 살펴보겠습니다..

 

  자.. 이번에도... 핸폰을 가지고 이야기 해보도록하죠... (요즘 핸펀을 사야해서.)

예전에.. 이런 핸폰이 있었습니다.. 단음에다가.. 문자보내고.. 흑백에다가 전화하는..

  이런 핸폰이죠.. 그 다음에.. 4poly... 4gray, 역시 문자보내고.. 전화되는..무선인터넷도!

그리고, 16화음.. 흑백.. 문자되고.. 전화되고 무선 인터넷되고 전자수첩기능도되는..

그리고.. 40화음.. 컬러.. 문자 전화, 무선인터넷,전자수첩, Gui기반의 인터넷 되고...

그리고... (이제 화음과 컬러에 대해서는 언급하지 않겠습니다.. 이 부분은 다음 강의
 이므로.. ^^;; 기능에 대해서만.. 보세요~~ ^^ ㅎㅎ)

  이제 핸폰에서 문자, 전화, 무선인터넷, 전자수첩, Gui인터넷,게임, 카메라...

그리고.. 이제 동영상까지.. 헉헉.. 참.. 핸폰에.. 기능이 무쟈게 많아졌네요!!!

놀랍죠? ㅎㅎ.. 하지만.. 제 핸폰은.. 16화음... 흑백이랍니다. -.-;; 핸폰사고 싶어요!


  어쩄거나.. 자.. 그럼..이제 가상으로 핸폰을 만든다고 봅시다!


  처음에.. 핸폰은 전화랑 문자만 됐네요.. 시간이 흘러..

유후.. 전화랑 문자랑 무선인터넷이되는 핸폰을 만들어야해요...

자.. 처음부터. 열심히 전화기능, 문자기능, 무선인터넷기능을.. 넣어서..

핸폰을 하나 떡하니 만들었죠~~ 뭐 이정도 쯤이야~ ㅎㅎ

  자.. 그런데.. 핸폰의 진화속도 알잖아요.. -.-; 뭔넘이.. 젠당..

이번엔.. 전화랑, 문자랑, 무인(무선인터넷),전자수첩기능도 되는...

아.. 열심히.. 다시.. 전화 기능이랑, 문자기능이랑, 무인기능이랑,전자수첩기능을

자~~~알.. 만들어서.. 핸폰을 만들었습니다...

  그리고 나서.. 쉬려니깐. 이번엔.. 문자,전화,무인,전자수첩,GUI인터넷...

에고..또.. 열심히 하나하나. 프로그램을 짜서.. 핸펀에 집어넣고.. 만들었습니다.

  오호라. 통제야!! 이번에.. 또. 사진도 찍는 기능을.. 넣어야 하네요..

에공.. 며칠밤을 새서.. 모든 기능을.. 다시.. 프로그램으로 짜서...

핸폰에 살짜쿵.. 넣어 줬씁니다.. -.- 졸려 디비져자고 싶어요!!!

근데 자려고 하니깐.이번엔.. DMB 기능을 넣으래요.. -.-;; 콱.. 미쳐 버리고 싶어요..


아구.. 비스무리한 내용을.. 몇 줄씩 보려니깐.. 막 짜증이.. 나려고 하나요?

그걸.. 쓰고 있는 인간도 있으니.. 걍.. 봐주세요.. ㅎㅎ

  자.. 위에 내용을 보면.. 이런 생각이 들지 않나요?

  아 뭐하러.. 같은 기능을.. 계속 매번 작성을 하냐? 걍.. 한 번 작성하고.. 똑같이..

하면될텐데... 그죠? 안 그래여? 걍 똑같이 해여? 아니죠? 그래야죠..


  잠깐..그런데.. 한 번 작성하고. 똑같이. 하면 될텐데에서.. 혹시.. copy & paste를..

생각하셨다면.. 대략 난감하죠!!.. 그렇게 생각하면 안되는거죠~~~

  상속이란 말을 배웠잖아요~~ 아.... 이제 감이 오시나여? ^^

  처음에... 기본적으로 전화기의 기본기능(문자,전화)을.. 기본으로 두고..

 다음에 추가적인 기능이 필요할 때.. 이너넷같은거요... 그럴 때는..

기본기능을... 가져오고... 추가적인 기능만 구현을 하는거죠.. 그걸.. 두 번째기능

이름지으면 거기에 추가적으로 필요하게 될 때에는.. 두 번째 기능을 가져오고.

거기에 또 추가적인기능을.. 넣구.. 이런식이 되는거죠..


  자... 이제 이걸 객체지향 개념에서.. 보면... 처음에.. 핸드폰이란 클래스를

설계하는거죠...

  class 핸드폰

{

   public void 전화하기() { 어쩌구~};

  public void 문자보내기() { 저쩌구~};

  }

자.. 이제 이걸 가지고 쓰는거지요.. ^^ 어떻게요? 아래처럼요..

  class 꼬진핸드폰 extends 핸드폰

  {

     public void 무선인터넷() { ~~~};

  }

이러면. 꼬진 핸드폰에는.. 구현한것은.. 무선인터넷뿐이지만.

  핸드폰이란 놈을 상속 받았으니..(extends 는 핸도픈이란 넘의 기능을

  상속받는 다는 뜻이지요.. )

  

  또.. 같은 방식으로.. 이렇게하면..

class 좀나은핸드폰 extends 꼬진핸드폰

{

    public void GUI인터넷() {~~}

}

이렇게 하면.. 꼬진핸드폰의 기능을 모두 가져오게 되는거죠..

꼬진핸드폰은 기본적으로 핸드폰의 기능을 모두 가져왔으므로..

결국 좀나은 핸드폰은.. 핸드폰 기능 + 꼬진핸드폰부가기능 을..

모두 갖고 있게 되는거죠.. 마찬가지로. 이런식으로. 계속.. 상속을 해서. 쓰면

된다는거죠. ^^ ㅇㅋ?  별로.. 시답지 않은 내용을 길게 썼나여? ^^

읽는것보다. 쓰는게.. 더 오래 걸리는거 아시죠? 걍. 이해해 주세요. ㅎㅎ


  자.. 이렇게 쓰면.. 뭐가 좋겠어요? 손 들어볼까요?

손손손~~~ 코드를 재활용 하는데.. 좋겠죠? 즉.. 같은 내용을.. 귀찮게시리.

반복해서.. 계속 해야되는.. 일을 하지 않고.. 간단하게.. 미리 작성된

내용을 재활용해서 쓸 수 있으니깐.. 훨씬 편리하고.. 시간적으로도..

더 좋겠죠.. 누군가는 새롭게.. 다 모두 짜고 있을 때.. 나는 퍼뜩 끝내고..

쉴 수 있으니까요~~


  그렇다면. 좋은 점이 그것뿐이가여? 아니죠~~ ^^

더 있습니다요!! ㅎㅎ 자.. 그럼 무엇이 있는지 알아보죠~~ 뭐. 까짓것.. ^^

  

  그런데. 쓰려고보뉘. ^^ 지난 번 캡슐화 시간에 한 얘기를 다시 한 번...

생각해보기만해도 되겠네요. ^^ 지난번 시간에.... 문자를 보낼 때...

핸드폰 번호를 입력하는 부분을 가상으로 꾸며보았었는데요...  

기억이 안난다구요? 그러실까봐. 아래.. 보세요!!


private int phoneNum1;

  public boolean setPN1(int pn)

{

    if(pn == 010 || pn == 011 || pn == 016 || pn == 017 || pn == 018 || pn == 019)

    {

           phoneNum1 = pn;

           return true;

     }

    else

    { 

          System.out.println("문자를 보낼 알맞은 핸드폰 번호가 아닙니다.");

          return false;

    }

 }


 이런 내용이었죠... 근데.. 이 부분에 대해서. 다시 생각해보면.. 문자를 보내는

것은 아까. 처음에 핸드폰에 기본적으로 들어있는 기본 기능이죠...

  그렇다면.. 문자를 보내는 부분이 달라져야 할 떄.. 가령.. 예전 핸폰의 경우엔

010은 핸폰번호로 인식하지 못해서 문자를 보낼 수 없는 경우가 있답니다. (제꺼..)

그럴 때.. 프로그램을 변경해주어야겠죠? 010도 핸폰으로 인식하도록 말이죠..


  그럼.. 이제까지 만든 핸폰을 다 따로 따로 프로그램화 하였다면..

핸폰마다 다 바꿔줘야 하나요? ㅠㅠ 죽음이겠죠? ^^ 하지만.. 이렇게.. 상속을

이용하게 되면.. 가장 기본이 되는 부분에서만 한 번 딱 바꿔주면. 다른 부분은..

그 부분을 상속해서 쓰기만 하니깐.. 따로 바꿔주지 않아도 되겠죠? ^^

그럼 뭐에 좋나요?.. 물론.. 유지보수에.. 보다 효율적이겠죠. ^^ 전체적으로..

건드릴 필요가 없으니까요. ^^ 그것을 상속받아서 쓰는 것들은 따로 고칠 필요가

없게되니까요.. ^^... 아 정말 편하군요!!


  자.. 그럼. 상속을 통해서 이뤄지는 좋은 점들은 어느 정도. 대략 안 것같구요..

그럼.. 실제적으로. 상속을 할 때.. 어떤식으로 해야하는지에 대한 유의점들을...

살펴보도록 하지요.. ^^;


  자.. 그럼 우선 기억력을 더듬어서 첫 시간에 배웠던.. 객체지향에서..

문제 해결 방법론에서.. 어떤게 있었는지 기억나세요? ^^? 안나시죠?

앗! 아신다구요? 뭔데요? 아. 추상화요.. 맞습니다. 근데.. 그걸 말하려고 하는게

아니구요. 아 그럼 캡슐화? 네 그것도 맞긴 맞습니다.. 그래도.. 아.. 모듈성이요?

네.. 네.. 모두 다.. 방법론 중에 하나지요.. 하지만 지금 말씀드리고 싶은 것은...

그게 아니라... 바로 계층성이란 넘입니다.. 계층성이 머였을까여?


다시 한 번 기억을 더듬어 볼까요?

계층성(hierarchy) : 객체로 나눌 때, 공통된 성향을 가진 것을 상위,

                                구체적인 것이 하위로 계층을 이루게 됨.

 네 이제 기억이 나시는지요? 이제 뭔지 알고보니깐. 왜 이야기를 꺼내려는지

감이 조금은 오시겠죠? 그렇습니다.. 상속과 관련되어있죠?

공통된 성향을 상위.. 구체적인 것을 하위로.. 계층을 이룬다는 것...

즉.. 공통된 성향들을 모은.. 기본 클래스와.. 그들을 구체화한..

서브클래스가 있는 것이지요...


  아까 위에서 살펴 본 핸펀 클래스에서 보시면 알겠지만.. 상위 클래스가

되는 넘들은... 가장 기본적인 것들을 공통적으로 뽑아서... 기본클래스를 만들고..

그것보다. 좀 더 자세한 기능을 부가적으로 넣고 싶으면.. 해당 기본 클래스를

상속받아서.. 설계를 하는 것이죠.. 그리고.. 그 부가적인 클래스도 물론..

그것보다. 더 상세화된.. 클래스의 기본 클래스(부클래스)가 될 수도 있구요..


가령.. 위에서 말한  '좀 나은 핸드폰'을 상속받아서.. 은행거래가 가능한 폰을

만들 수도 있구요... 또 은행거래는 되지 않아도. mp3가 되는 폰을 만들 수 있지요.

이 때에.. 좀 나은 핸드폰은.. 이미 꼬진 핸드폰을 상속받아서.. 꼬진 핸드폰을

구체화 한 것이긴 하지만... 이 '좀 나은 핸드폰'이 mp3폰과.. 은행거래 폰에

대해서는.. 그들의 기능을.. 공통적으로 뽑아만든 부클래스가 될 수도 있지요..

즉.. 한 계층이 아니라... 여러 계층으로.. 클래스는 구성될 수 있습니다..

자바 API에서도 보시면.. 여러 계층으로 되어 있는 클래스들을.. 찾아볼수 있습니다.

한 클래스에 기능을 모두 모아두는 것보다. 그렇게 계층을 이루어서...

해놓으면.... 좋은 점들은 위에서.. 말했었구요..


다만... 계층성의 정의에도 있지만.. 공통된 성향을 가진 것을 뽑아서..

놓아햐 합니다. 괜히.. 그다지 필요도 없는 부분들까지.. 뽑아서.. 기본 클래스로

정의하고..그렇게 되면..그것을 상속받을 때. 굳이 필요없는 부분들로 인해서.

오히려 더 좋지 않겠죠? 가령 핸폰의 계층에서.. 좀나은 핸드폰을 상속받아서..

은행거래 기능을 넣고.. 그걸 또 상속받아서.. mp3폰을 만들었습니다..

그런데.. 이 mp3폰중에는.. 은행거래가 있는 폰과 없는 폰으로 출시되어 있씁니다.

하지만.. 이미 핸폰의 내장된 프로그램에는.. 굳이. 은행거래 기능까지있는거지요..

뭐.. 대략.. 억지 예를 들자면 그렇다는 겁니다... ㅎㅎ


  그러니깐.. 계층을 지을 때.. 상위 클래스는.. 반드시 필요한 부분들만.. 모아서..

기본 클래스를 정의해야 합니다... 뭐. 그렇다고.. 너무 쓸 떼 없이.. 많이...

계층을.. 짓는것도 좋지 않습니다..

가령.. 처음 핸폰에 전화 기능을 넣은 클래스를 만들고. 그걸 상속받아서.. 문자

기능넣고.. 그걸 또 상속 받아서 전자사전 넣고.. .또 상속 받아서 계산기 넣고..

이런식으로.. 무의미하게.. 너무.. 많이 나뉠 필요도 없다는 것이죠.. ^^;

무슨 소린지 아시겠죠? ^^


  참.. 그리고. 아까부터. 꼭 필요한 기능을 넣는다고 했는데.. 이것도...

언젠가 들어본 기억이 나지 않으신가요?.. 바로 추상화 작업이죠.. ^^

클래스를 설계할 때.. 계층을 만들 때... 클래스 자체를 만드는 것이 추상화

작업이듯이.. 이것도.. 계층을 이루는 것도. 결국 클래스를 만드는 것이므로.

추상화 작업을 거치게 되는 것이죠? ㅇㅋ?


자.. 이제 두 세가지 사항만.. 간단히 더 살펴보고.. 끝내도록 할께요~ ^^

우선.. 처음에 말씀드리다가 만 내용입니다..


  처음에..이런 말을 했었죠?


나의 부모가 나에게 알려준 능력을.. 나는 쓸 수가 있다


하지만.. 그 후로. 설명을 할 때는.. 걍.. 부모의 기능을 무조건 쓸 수 있다라고

한다음에.. 했는데요.^^;; 이제. 이 부분에 대해서.. 간략히 보지요..

처음에 말했든이.. 부모가 나에게 알려준 기능만을 쓸 수가 있습니다..

부모가 알려주지 않은 기능은 쓸 수가 없는 것이지요.. 바로.. 접근지정자

말하는 것인데.. 기본 클래스에서 선언된 내용들 중에서.. (멤버변수나 메서드)

그것을 상속받은 클래스가 쓸 수 있는 것은.. protected와 public입니다.

(default는 뺐습니다... 패키지 개념까지는. 언급하지 않겠습니다..)

  이 때. public는.. 모든 클래스에 공개한 것이고... protected는.. 그것을 상속

받은 클래스에게만 공개한 것입니다.. 그럼.자신만 아는 것은 뭘까요?

네.. 클래스도 자기의 프라이버시가 있씁니다... 바로. private입니다.p

private로 선언된 것은.. 클래스 자기 자신밖에 알 수 없습니다..

그러므로.. 기본 클래스라 하여도.. 자신이 공개한 부분만 상속받은 클래스에서

쓸 수 있으므로.. 부모가 알려준 능력만 쓸 수 있다고 한 것입니다..


이번엔. 핸폰 이외의 예를 들어서 보겠습니다..


아버지가 있구요. 아들이 있습니다.. 물론 어머니도.. 있습니다..

매달.. 아들은 아버지께 용돈을 받습니다. 물론 이 사실은 어머니도 알구요..

그래서 아버지한테. 용돈을 달라고 요청을 하고.. 받습니다..

그런데.. 아고.. 술을 좀 과하게 마시고나서.. 쏴 버렸습니다.

(전 술을 마시지는 않습니다만.. ㅡ.ㅡ;)

  그럴 때는. 어무이 몰래.. 아부지께. 싸나이대.. 싸나이로.. 비밀용돈을

달라고 요청을 하지요.. 그러면. 아부지는.. 어딘가에 몰래 숨겨놓은..

비상금을 꺼내서.. 비밀용돈으로 주십니다.. 물론.. 이건 저한테만

주는 것이지요~ ^^ ㅎㅎ 하지만.. 그 비상금이 어디있는지는..

저는 모르지요.. 안다면. .아마도.. 벌써.. 꺼내서... 제가 술 펐겠죠? ^^


자.. 여기서. 내용들을 살펴보면.. 공식적으로 받는 용돈이 바로..

public으로 선언되었일 것입니다..  그리고 아부지의 아들인 저에게만

몰래 주시는 것이... 비밀용돈.. 즉. protected이지요.. 하지만...

아부지가 아시는 비상금은 바로 private입니다요.. ^^

자.. 어떤 의미인지? 이해가 가시는지요? ^^;


자.. 그럼 이번에 또 다른 내용에 대해서..


final이란 키워드가 있습니다.. 이건... 더 이상의 상속을 금지하는 것입니다..

즉.. 클래스에.. final이란 키워드가 붙으면.. 그 클래스의 상속은 더 이상

할 수 없게 해 버리는 것이지요. ^^. 뭐.. String 클래스가.. 바로 그런 예중에

하나이지요.. 이걸 하면 무엇이 좋을까여? ^^;; 제가 알고 있는 바로는..

효율성이 더 좋아진다는 것이었는데.. 정확한지 모르겠네요..

효율성이 어떤 면에서 좋아지는지는.. 제가 알고 있었던 것은.. 다형성측면에서..

메서드를 호출할 때. 어느 객체의 메서드가 호출될지에 대한 것이.. 동적으로..

정해질 수 있는데.. 그것을 위해서.. 모든 클래스는 내부적으로. 가상테이블이

존재하게 되는데.. 더 이상 상속될 수 없는 클래스의 경우에는 그것이 생기지

않아도 된다는 것인데.. 좀 자세히 들어가면. 좀 복잡해지고.. 자바에서..

제가 알고 있는 내용이 확실한지 몰라서요.. 걍.. final이란 넘이

뭐하는 넘이구나!~ 정도만 알아두세요~ ^^ 아셨죠?

뭐.. 부지런하신 분들은 책에서 직접 찾아보세요~


자.. 이제 마지막입니다.. 늘 마지막에 그렇듯이.. 매우 간략합니다..

자바에서는 다중상속이 되지 않습니다.. 다중상속의 문제점들로 인해서.

다중상속 자체를 금지하고 있지요.. 다중상속의 문제점에 대해서는..

책을 참고해보세요~ ^^ 직접 찾아보는 재미도 쏠쏠 하답니다.

그것을 위해서.. interface라는 것이 있습니다.. 인터페이스는

다중상속이 가능하지요.. 물론 인터페이스 들끼리.. 상속도 가능하구요.. ^^

여기서는 이정도로만 하죠... ^^


추가로 필요한 사항은 질문 혹은. ^^ 직접 찾아보시는 것도 좋을 듯 합니다. ^^

결국 공부는 스스로 하는 것이니까요~ ^^

그럼 좋은 하루 되시구요!!


이제 객체지향.. 강의는 다음 4번쨰.. 다형성을 끝으로. 끝나게 되겠네요. ^^


아오.. 모두. 열공하세요!! ^^


               Pride Of PlmingZIGI™