Download VCard

© 최병일 1981-‘10

객체 지향 소프트웨어 일주 - 2

작성자: yagur Rev : 2

 Around Object Oriented Software - 2

 2. 추상

컴퓨터 과학은 추상화의 과학이다. - A. Aho and J. Ullman


 추상화(Abstraction)

  프로그래밍을 접해본사람은 '추상'이란 단어를 아마 수백 수천번은 보고, 듣고 했을것이다. 이 추상화Abstraction란 기술은 객체 지향 프로그래밍에서 중요한 여러 기반 기술 중 하나이다.
  우리가 자주 하는 추상화는 말속에 들어있다. "이것" "저것"과 같이 대상을 지칭을 하거나, "과일" "동물"과 같이 공통점에 의해 개체Instance들을 객체Class로 분류 하거나, 숫자나 기호와 같이 약속된 의미를 두기도 한다. 이들은 모두 구체화되지 않고 그 자체만으로는 '개체화Instantiation가 불가' 하다는 공통점을 가지고 있다. 예를들어 "과일"이란 객체만으로 개체를 만들기엔 구체성이 부족하다. '내가 먹을 책상위의 바나나'란 개체로 과일을 개체화하려면 '노란 껍질에 모양이 휘고, 단맛을 지닌' 바나나라는 구체적인 객체가 필요하다.
  대상을 지칭하는 추상의 개념은 컴퓨터 언어속에도 존재하고 있다. C++과 Java에선 this 그리고 Python에서는 self라는 키워드로 객체 자신을 지칭할때 사용한다. 혹은 '이미 개체화된 객체'를 사용자가 레퍼런싱 함으로서 대상을 지칭하는 용도로 쓰인다.
 예를 들자면 아래와 같다.

ex> 자신 지칭
Human::Human(bool gender)
{
    this->gender = gender;
}


ex> 상위 분류로 지칭
 Human nancy;
 Animal* she = &nancy;
 she->Eats(hotDog);

 피카소의 추상화抽象畵를 보면 개체가 가지는 특징(윤곽)을 나타내 추상화Abstraction한다.
사용자 삽입 이미지사용자 삽입 이미지
  원본 그림을 몰랐다면 연상이 안될수도 있다. 하지만 구체적인 것(추상화 대상)을 안다면 추상화된 결과물을 보고 무릎을 탁칠수도 있는일이다. 피카소의 그림은 공통 윤곽을 잡아 기하학적 추상화를 하고있는것으로 보인다. 컴퓨터 언어의 객체 추상화도 다를것이 없다. 서브 클래스들의 공통 분모를 찾아 슈퍼 클래스로 일반화 하기도 하며, 추상 객체인 슈퍼 클래스를 미리 정의 해놓고 하위 클래스로 서브클래싱하기도 한다. 이들을 상속 관계Inheritance에 있다고 한다. 그리고 상속은 객체 지향 프로그래밍의 기반 기술중 하나이다.
  추상화는 단계적으로 이루어질수도 있다. 피카소가 소를 단계적으로 추상화하는것이 인상적이다.
화살표를 누르면 추상화가 되가는 과정을 볼수있다.

 피카소의 추상화는 공통점을 모아 기하학적 예술로 승화시키고 있다. 이 예술의 가치중 하나는 작품을 보고 '서로 다른 의미를 부여'하는 것으로 볼수 있다. 달리 말하면 의미적 다형성Semantic Polymorphism을 지니게 되며, 다형성이 추상화의 중대한 가치가 되는것이다.

사용자 삽입 이미지
최종 추상화 결과물

  피카소가 마지막까지 추상화한 결과물을 보고 여러가지를 연상할수 있다. 주로 네발달린 짐승으로 뿔을 가진 동물을 연상할것이다. 그리고 추상화된 성기 부분을 관찰해낸 사람은 수컷을 연상하기도 할것이다. 추상화 결과물의 의미가 다형을 갖는 가치는 컴퓨터 언어도 비슷하다.
  최종 결과물로 부터 추상화 단계를 역으로 볼수록 점점 그 형태가 구체적이 되서 의미적 다형성을 점점 잃어가는것을 볼수 있다. 컴퓨터 언어의 객체도 마찬가지이다. 추상화 계층의 깊이가 깊어질수록 객체의 다형성은 커지고 덜 구체적이 된다. 피카소의 그림은 기하학적인 추상화를 이루며 구체성을 줄이지만, 컴퓨터 언어의 객체는 행위Behavior와 구조Structure를 추상화 하며 구체성을 줄이는 점이 차이점이라 할수있다. 공통점은 이들이 최소한의 공통점으로 대상을 표현하려 함으로서 유용한 다형성을 지닌다는 점이다.
  컴퓨터 언어의 관점에서봤을때 추상화는 중복 제거의 의미보다 다형성의 가치가 매우 크다고 생각하며, 추상의 개념은 이에 매우 밀접한 관계에 있다. 이 객체들의 추상화 품질은 객체 지향 소프트웨어의 내부 디자인 품질을 판단하는 좋은 기준이 될수 있다.



 인터페이스(Interface)

  객체가 극도로 추상화 되다보면 속성이나 구조는 사라지고 행위Behavior만이 남는다. 이때 이 순수 추상 객체(Pure Abstract Class)를 인터페이스라고 부른다. 실생활에서 우린 좋은 인터페이스의 예를 가지고 살고 있다.

사용자 삽입 이미지
필립스사의 통합 리모콘

 통합리모콘이 그 예이다. 이 필립스 리모콘은 1100여개의 기기를 하나의 리모콘으로 접근한다. 각 기기들의 적외선 코드를 모두 가지고 있다. 우리가 보고 있는 것은 인터페이스이며, 그것의 구현은 생각하지 않아도 된다. 단지 기기를 선택하기만 하면 같은 버튼으로 동일한 기능의 행동을 할수 있다. 예를 들어 Sony TV의 채널을 바꾸는것과 Samsung TV의 채널을 바꾸는것은 단지 '채널 변경 버튼'만으로 가능해지는 것이다. 변하지 않는 모든 기기의 일반적인 레이아웃을 모은 인터페이스라고 보면 된다. 그리고 각 기기별 리모콘 적외선 코드 구현은 내부에 감추어져 있다.

사용자 삽입 이미지

 하단의 세가지 리모콘은 DVD-Player, TV, Amp 기기의 리모콘들이다. 통합리모콘이 없다면 기기들의 전원을 켜기 위해서 리모콘을 세가지 다 가지고 있어야 한다. 그리고 세가지 리모콘의 전원 버튼을 전부 한번씩 눌러야 전원을 킬수있다. 하지만 이제 공통의 기능 버튼을 모은 인터페이스인 통합 리모콘(상단의 필립스 리모콘)을 가지고 있으므로 나머지 리모콘은 옆에 보관하면 된다.
  인터페이스에 접근하면 모든 기기에 접근할수 있게 되었다. 즉 필립스 리모콘은 다형성을 지니고 DVD 리모콘으로 되었다가, TV 리모콘도 되고, 앰프 리모콘도 되는것이다. 예외의 경우는 공통 인터페이스가 아닌 고유의 기능을 조작하기 원할 경우, 해당 기기의 번들 리모콘으로 접근해야한다(다운 캐스팅을 생각하면 된다).
  번들 리모콘으로 접근하는것을 불편하게 생각해서, 다른 통합 리모콘은 수십개의 버튼을 지니고 있는 경우도 있다. 하지만 너무 많은 버튼때문에, 대부분의 버튼이 아무기능을 하지 않는 경우가 많다. 사용자는 어떤 버튼이 제대로 동작하는지 눌러보기 전까지 알수없다. 이것은 잘못된 추상화의 부작용이다.

'개발 > 수필' 카테고리의 다른 글

객체 지향 소프트웨어 일주 - 3  (0) 2008/03/28
테스트와 장인 - 8  (0) 2008/03/19
객체 지향 소프트웨어 일주 - 2  (2) 2008/03/15
테스트와 장인 - 7  (0) 2008/03/12
객체 지향 소프트웨어 일주 - 1  (0) 2008/03/11
테스트와 장인 - 6  (2) 2008/02/25
Comment 2 Trackback 0
  1. 황상철 2008/03/26 15:35 address edit & delete reply

    요즘 일이 바빠 오랜만에 들렸더니 좋은글을 많이 올리셨네요. 잘 읽고 갑니다.

    • yagur 2008/03/27 08:00 address edit & delete

      잡담성 생각들이 많은데, 좋게 봐주시니 감사합니다.

Trackback : http://yagur.impon.net/trackback/130 관련글 쓰기

Top

prev 1 ... 14 15 16 17 18 19 20 21 22 ... 81 next