퇴근5분전

 누님께 객체지향을 설명드리면서 작성했던 문건을 블로그에 등록해본다.
실제 코드사용은 더 복잡시렵기도 단순한기도 하지만, 설명을 위해
최대한 짧고 포인트되는 부분만 다뤄본다고 정리 해보았으나 ...
역시 표현이 부족하다는건 늘 느낀다.


-- 아래는 설명에 필요한 내용들을 적었다가 설명이 끝나면서 따로 정리해서
보내주고 그 문서를 여기에 등록하였음.

 단순히 클래스를 정의 하고 그 기능을 호출하고자 할때 점을 찍어서 접근 가능한
멤버에 기능명을 호출하게 됨.
 
  class 휴대폰
 {
           켜다();
           끄다();
 }

   휴대폰.켜다(),          휴대폰.끄다();

 이렇게 되면 휴대폰 를 켜다, 휴대폰 를 끄다!! 라고 표현이 가능하고
실제 구현부는 휴대폰 를 켜고 끄는 동작에 대한 기술을 할수 있게됨.  와~~!!!  쉽다!

 그러나 켜다 끄다라는 기능은 휴대폰에만 있는 기능이 아니고,
컴퓨터, pc, 형광등, 에어콘...등... 제품에 전원을 넣고, 끊고에 대한 처리이므로
공용으로 사용 가능한 기능이 된다.

 그러면 컴퓨터, pc등의 제품들에 켜다, 끄다의 기능을 주고자 할때는 어찌하면 되는가를
생각하게 된고 아래와 같이 단순하게 표현해 보았다.

 class  전자제품
 {
              켜다();
              끄다();
 }
휴대폰 : 전자제품 {} ,          컴퓨터 : 전자제품  {} ,          pc : 전자제품 {} ...

등 상속을 통해 해당 제품에 대한 켜다, 끄다의 기능을 부여하게 됨

IS-A 관계라고 함.

          휴대폰 IS 전자제품( O ), 전자제품 IS 휴대폰(O)

 현재 시중에 있는 휴대폰은 다양한 기능을 가지는데 이 휴대폰을 만들어 보자!

기본적으로 휴대폰에 있는 기능들을 나열해볼까?

  휴대폰 {   전화, 게임, 다이어리, 사진, 동영상, mp3 ... } 참 많은 기능이 있음.

-> class화 해보자!!

class 휴대폰  : 전자제품
{
        전화;
        게임;
        다이어리;
        카메라;
        저장소; ...
        버튼들;
}

간단한 휴대폰에 기능을 넣어봤음.  넘 쉽자나~!

 휴대폰에 포함된 기능에 관련된 객체들은 HAS -A 관계로
        휴대폰Has게임(O), 게임Has휴대폰(X) , ...
        휴대폰IS게임(O), 게임IS휴대폰(X), ...

휴대폰은 게임을 가진다, 게임은 휴대폰을 가진다..의 차이!!랄까?
또 휴대폰은 게임, 게임는 휴대폰.

어감에 차이가 있지만 그나마 말이되는것을 찾을수 있게 됨.

        휴대폰IS전화( O ) , 전화IS 휴대폰 ( O )    어랏!!

휴대폰은 전화다, 전화는 휴대폰이다.. 이렇게 일치되었음에도
상속을 통하지 않고 포함을 이용하는것은 설계자 맘이다! ㅡ.,ㅡ;;
이때는 전화를 어떻게 설계하느냐에 따라 상속을 통해야하는가
포함을 써도 되느냐에 틀려짐.  아리송~~~ 해~!

객체와 객체간의 관계는 함하느냐, 상속하느냐! 로 구분지어서 생각해보자!!

아래 전화를 정의 한것을 보면...
- 전화 고유의 기능으로 전화를 직접 생성해서 이용가능
Class 전화
{
   public    송화(송화음 );
   public    수화음 수화();
   public    연결(전화대상);
}

- 전화 고유의 기능을 내부에 감추어두고 상속한 자식객체만이 사용가능하게 만듬.
Class 전화
{
    protected   송화(송화음 );
    protected   수화음 수화();
    protected   연결(전화대상);
}

두가지의 전화중 어떤 전화를 이용하느냐에 따라~ 상속을 하느냐 포함을 하느냐로
결정할수가 있게 됨.  아하!! 하시겠죠?

추상화 객체???

 객체를 처음 만든다고 했을 때, 해당 객체의 기본 기능을 정의 하고, 기본적인 기능에 대한 구현 및
멤버들을 정의하여 실제 객체에 적용(상속)시 기본기능이 빠지지 않게 하고자 함이며,
인터페이스처럼 자체적인 객체 생성은 불가하다. 또 추상메서드를 포함하여 객체 상속을
통해 자식객체에게 그 구현부를 떠넘기게 되며, 이는 반듯이 정의 되어야 객체로서
쓸모가 있음을 판단하게 해준다.
 

 추상 말그대로... 상상속에 객체를 만드는 것임.

abstract class 휴대폰  : 전자제품
{
       전화;
       게임;
       abstract void fnDispla();
}

내가 만들 휴대폰은  간단히 전화와 게임만 되는 휴대폰이다.


Class 햅틱 : 휴대폰
{
     override void fnDisplay(){
           // 표현!!
       }
}

   이렇게 간단한 코드로 휴대폰을 만들었고.
 또 다른 폰을 만들기 위해서는 휴대폰을 넣으면 됨.

이건 햅틱이란 모델이 되겠다.
전화+게임+Mp3기능을 갖춘 A모델이고
전화+게임+카메라기능이 있는 B모델도 만들수 있게 된다.

Class 햅틱_Mp3 : 햅틱                           ---------------( A모델 )
{
     Mp3;  
     노래소리 fn음악플레이(){     // mp3 플레이~~    }
}

 Class 햅틱_카메라햅틱                       ---------------( B모델 )
{
     카메라;  
     void 찰칵( ){   저장( 카메라.사진 );   }
     저장(사진);
     저장(동영상); ...
}


전혀 다른 모습에 다른기능이 담긴 휴대폰을 만든다고 했을때
class 오즈 : 휴대폰...   처럼도 가능해진다.

재사용성!! 이란것을 충분히 이용하게 됨.


인터페이스??
 : 인터페이스도 추상 객체처럼 혼자서 객체가 되지 못함. 

객체와 객체간에 연결시 인터페이스를 이용해서 1: N 관계를 형성할수 있게 해줌.

인터페이스를 상속받아 구현한 객체는 이 인터페이스를 이용하는 객체와 연결이 가능해짐.

간단한 예를 들자면  마우스에 USB라는 인터페이스를 이용해서
PC에 IO에 USB포트에 가져다 넣고 마우스 이동좌표, 클릭된 버튼값들의 값들이 PC전송이 됨. 만들어보자!!

interface IUSB
{
         Data{ get; set;}
}

class 마우스 : IUSB
{
       마우스볼;
       휠;
       버튼[];
       Data
       {
           get{ return (마우스볼+버튼+휠)_데이타; }
           set{  }
       }     
}

class USB모듈
{
      USB모듀을가진PC;      
     데이타
     {
        set{        USB모듀을가진PC.USB데이타읽기  = value;        }
       }
}


class  PC
{
       USB모듈;
       USB데이타읽기;
       USB포트( IUSB    usb)
      {
           USB모듈.데이타  = usb.Data;
        }       
      /// pc 동작!! ...
}


위처럼 객체가 4개 정도 풀어서 만들었다면.
PC  pc  = new PC();
마우스 mouse = new 마우스();
pc.USB포트( mouse ); 이렇게 사용이 가능해짐.

IUSB  =  mouse; 라는 등식이 성립하므로...
업캐스팅이일어나게 됨.

USB포트( IUSB    usb) 이걸 왜 이렇게 하는가?

PC객체는 인터페이스를 이용해서 다른 객체를 받아들임으로써
연결되는 두객체간에 결합구조를 느슨하게 만들어줄수 있게 되고
이렇게 USB포트에 연결될 객체는 반듯히 IUSB 라는 인터페이스 규격을 맞추어야 사용이
가능하므로 규격화가 가능해짐.

PC – 마우스, 키볻, 스캐너....등...  IUSB를 상속받아서 사용하는 주변 소모품들을 객체화 가능해지고 PC와 데이타 교환을 프로그래밍으로 표현이 가능해짐.


 

'# 1) 프로그래밍' 카테고리의 다른 글

디자인 패턴관련...  (0) 2009.07.13
인터페이스  (0) 2009.07.10
객체지향을 꿈꾸며...  (0) 2009.07.10
노가다~~ 고고싱~?  (0) 2009.06.29
객체지향 관련된 글  (0) 2009.05.04