본문 바로가기

Programming/JAVA

java : 구성(composition)과 위임(delegation)

구성, 위임 등은 headfirst OOA&D 에서 자주 상기되던 개념입니다.
구성이라는 것은 클래스가 다른 클래스를 인스턴스 변수로 가진다는 의미로 보실 수 있으며
위임은 클라이언트 코드에서 구성하고 있는 인스턴스 변수 객체(말이 어렵네요. 참조객체라고 하면 쉬울까요 ㅎㅎ;)
를 통하여 메소드 호출 등을 말하는 것입니다.

아마 수개월전에 headfirst OOA&D 학습하면서 끄적였던 것 같은데 이 주제를 다시 또 다루는 이유는
요즘 보고 있는 책에서 꽤 강하게 주장하고 있어서 적습니다.
서적 이름은 thinking in java라는 서적인데,
모두 읽은 것은 아니지만 headfirst java + OOA&D 느낌이 좀 있네요. headfirst 시리즈가 쉬운 용어들과 재밌는 사진들을
이용해서 거부감을 좀 줄였다면 이 서적은 상당히 전문용어들을 사용하면서 약간 무겁게 다가오네요.
두껍기도... 아주 두껍구요 ㅎㅎ;

OOA&D 에서도 기술되었듯이 상속보다는 구성을 이용하라고 하는데, 이 서적도 함께 요구하고 있습니다.
OOA&D에서는 그냥 '분리' 라고 표현하였다면 이 서적에서는 '완전한 분리' 라고 강하게 표현하네요.

thinking in java에서 다형성과 인터페이스(8, 9장) 에 대해서 이야기하면서 나오는 부분입니다.
"상속과 구성 중 어느 것을 사용할지 분명히 하지 않으면, 구성을 먼저 고려하는 것이 더 좋은 방법이다.
 구성은 상속 구조의 설계가 수반되지는 않지만 실행시 동적으로 타입을 선택할 수 있으므로 유연하다
 이에 반하여 상속은 컴파일할 때 정확한 타입을 알아야 한다."

예를 들자면 이러합니다.
class ABC { public void isABC() }
class A extends ABC{
   public void isABC(){ print("a"); }

class B extends ABC{
   public void isABC(){ print("b"); }
}
class Stage{
   private ABC abc = new A();
   public void change(){ abc = new B(); }
   public void play(){ abc.isABC(); }

class Test{
   public static viod main(String[] args){
      Stage stage = new Stage();
      stage.play();
      stage.change();
      stage.play();
   }


서적의 예제를 ... 베껴놓았습니다 -_-;;;
Stage 클래스는 A, B의 부모클래스인 ABC클래스를 구성하고있습니다.
처음 Test에 의해서 객체가 생성이 될때 인스턴스 변수 abc는 A 객체가 생성되면서 초기화 되는군요. 
그리고 play 메소드가 호출이 되는데 이때는 위임을 통해서 A 객체의 isABC() 메소드를 호출합니다.
그럼 당연히 a가 출력되겠네요. 

하지만, 곧 stage 객체의 클라이언트가 change() 메소드를 호출하였고 인스턴스 변수는 B객체를 참조하게되었네요.
그리고 play() 메소드가 호출되면 B객체의 isABC() 메소드를 호출하게 됩니다.

예전에도, 요즘도, 그래서 뭐 어쩌라고.... 라는 생각을 사실 자주 했었드랬죠.
그런데 문득 이런 생각을 하게 되었습니다. (각종 서적에서 했던 말을 이제사.... 알겠습니다. 라고 답변했네요...)
처음에 A객체의 프린트를 위해서
class AA extends A{
   public void isABC(){ print("a"); }
}
라고 AA 클래스를 또 상속을 통해서 작성하였다면 어떨까요.
나중에 클라이언트 코드에서 B가 필요할 경우엔? 다시 또 BB를 만들어주어야 하나요?
상당히 억지스럽지만 이러한 코드도 보일 뿐더러
아예 A, B 를 바로 가져다 쓰는 경우가 있다고 합니다.
편의상 가능한 말이지만.... C가 생기고 D가 생기고 하게되면 언젠가는 클라이언트 코드들을 죄다 찾아서
작업해줘야하는 번거로움이 생기게 됩니다.

흠.... 진정 구성과 상속, 위임 등에 대해 그 필요성과 철학을 이해하고 작성했나 모르겠네요.

thinking in java 의 도입부분에선 간단하게나마 C, C++, java에 대해 소개해줍니다.
프로그래밍언어구조론 나름 열심히 들었다고 생각했는데 얼떨떨했네요.
유명한 것은 알고 있었지만 책이 원체 두꺼워 손이 잘 안가고 있었는데 기회가 닿아 좀 읽어보니
프로그래밍 자체를 처음 접하는 분에게는 추천해드리기 별루고,
프로그래밍을 조금은 접해보셨던 분들께는 추천하고픈 책입니다. 

적다보니 책얘기가 대부분같네요.
참, 위에 작성한 예제는 State 패턴이라고 합니다!