ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 객체지향 상속의 단점과 해법
    안드로이드/Tip 2013. 10. 14. 15:11

    객체지향을 얘기할 때 반드시 빠지지 않는 말이 상속입니다. 상속을 기능 관점에서 봤을 때 상위 클래스의 기능을 계승하여 기 구현된 기능을 그대로 이용하거나 기능을 부분적으로 수정하여 사용하는 방식이라고 말할 수 있습니다. 상속은 구현해야 할 모듈의 공통 분모가 많을 수록 막강한 힘을 발휘합니다. 그만큼 기능을 확장하거나 변경해야 할 때 작성해야 할 코드 량이 극적으로 줄기 때문입니다.

    하지만 상속은 상위 클래스가 기능의 버그와 기능의 추가/변경 등으로 변화가 생겼을 때 상위 클래스를 상속받은 하위 클래스가 정상 동작할지를 예측하기 힘듭니다. 하위 클래스는 상위 클래스의 부분집합이기 때문에 상위 클래스가 변경이 일어나면 하위 클래스도 따라서 변형되기 때문인데요. 상속 구조가 복잡해지면 영향도를 예측하기가 어려운 단점이 있습니다.

    또 상속은 상위 클래스에서 하위 클래스로 내려갈 수록 기능 개방성이 커집니다. 즉, 하위 클래스는 반드시 상위 클래스의 공개된 기능들을 제공해야 하므로 하위 클래스에서 추가된 기능과 더해져 기능이 많아지고 복잡해지게 됩니다. (public 한정자의 메소드 개수가 계속 늘어납니다.) 또 어떨 때는 상위 클래스에서는 의미있는 기능이 하위 클래스에서는 더이상 무의미한 경우가 있습니다. (보통 이런 경우 예외를 throw하는것으로 동작하지 않도록 메소드를 override 합니다.) 이런 경우 불필요한 기능이 하위 클래스에 들어나게 되고 클래스를 사용하는 사용자 입장에는 동작하지 않는 메소드를 일일히 확인해야 하므로 어려움을 주는 요인이 됩니다.

    그리고 기능 확장에 따라 상위 클래스에서 파생된 많은 클래스들이 생겨나는데 규모가 커질수록 매우 다양한 클래스들이 존재하고 이 클래스들을 일관성있게 만들지 않으면 사용자는 이해하고 사용하는데 많은 어려움이 생깁니다.
    실업무에서 상속만의 해법으로는 문제를 해결이 어렵고 또 만들어도 이해하기 힘든 구조인게 다반사입니다.

    그렇다면 상속을 적극적으로 사용하지 않고도 기능의 재사용을 할 수 있는 방법이 있을까요?

    클래스간 결합 관계를 이용하는 것 입니다.
    결합이란 필요한 기능들을 클래스 필드에 두어 그 기능들을 적절히 사용하여 새로운 기능을 구현하는 방식입니다. 결합은 다른 말로 조립이라고도 말할 수 있는데 고유한 단위 기능들은 부품이 되고 그 부품들을 이용해 큰 부품 혹은 제품을 만드는 식입니다.
    결합을 이용하면 유연하게 기능을 합쳐서 새로운 기능을 만들 수 있고 기능을 확장할 수 있습니다.

    다중 상속의 컴파일러 구현의 어려움과 사용의 어려움으로 인해 현대 언어는 다중 상속을 지원하지 않는데 더불어서 다중 상속의 이점도 없어졌습니다. 하지만 결합을 이용하면 조립할 여러 기능들을 자유롭게 이용할 수 있으므로 다중상속의 장점이였던 여러 기능들을 조합해서 이용할 수 있습니다. 그리고 결합은 기능 폐쇄적이므로 상속처럼 불필요하게 기능 개방성이 커지지 않습니다. 오직 필요한 기능만 공개할 수 있습니다. (public 한정자 메소드가 사용자가 사용할 수 있는 필요 정도로만 디자인 됨)
    조립할 기능들은 필요로하는 기능만 재공하는 단위 기능이면 되는데, 일반적으로 단위 기능은 인터페이스로 대표할 수 있기 때문에 결합을 위해 클래스 필드의 선언은 인터페이스로 하는 경우가 대부분이 됩니다.

    이렇게 결합을 이용하게 되면 생성된 개체를 유연하게 조절할 수도 있습니다. 결합되는 단위 기능의 생성을 인터페이스를 통해 달리 함으로서 본체가 되는 클래스는 변경 없이 상황에 따라 다른 동작을 하는 클래스를 디자인 할 수도 있습니다.
    이런 경우 생성자를 통해서 결합할 기능들을 인자로 받을 수 있는데 사용자 측면에서는 접근이 어려울 수 있으므로 보통 팩토리 클래스를 준비해서 생성을 팩토리 클래스가 하도록 위임합니다. 팩토리클래스에서 내부적으로 어떻게 인스턴스를 생성하는지 알 필요없이 팩토리 클래스에 의해 생성된 결합 기능은 올바르게 동작을 할 것입니다.

    결합 방식은 단점도 있는데 단위 기능에서 제공하는 기능들 (public 메소드들)을 외부에서 호출하기 위해 똑같은 메소드를 재작성해서 해당 단위 기능을 호출하는 코드를 작성해야 하기도 합니다. 이런 번거로움을 제거하기 위해 Digital Mars에서 개발한 D언어에서는 alias this 라는 문법으로 코드를 작성할 필요없이 한줄로 호출 가능하도록 해줍니다.

    상속 방식과 마찬가지로 결합 방식도 어떻게 사용하느냐에 따라 이해하기 힘든 구조가 될 수 있습니다. 상속 방식이던 결합 방식이던 개발자 입장에서 기능을 재사용하기 쉽게 디자인 하고 사용자 입장에서 모듈을 쉽게 쓸 수 있도록 한다면 올바른 객체지향 프로그래밍이라고 할 수 있습니다.




    '안드로이드 > Tip' 카테고리의 다른 글

    네이트온 방화벽 우회  (0) 2013.10.07
    안드로이드 바탕화면 바로가기 추가  (0) 2011.12.15
    RGB 16진수 색상표  (1) 2011.12.05
    TextView에서 볼드체 쓰기  (0) 2011.10.27
    에자일 프랙티스  (0) 2011.10.18
    Intent 활용 TYPE 정리  (0) 2011.09.30
    스마트폰 계급도  (0) 2011.09.19
    안드로이드 OS 버전  (0) 2011.08.30
    Vertical Seekbar 응용  (0) 2011.08.18
    이것이 안드로이드의 구조  (0) 2011.08.09

    댓글

COPYRIGHT 2010 EpoNg. ALL RIGHTS RESERVED.