Skip to content

데코레이터 패턴 #
Find similar titles

Structured data

Category
Programming

객체지향과 상속을 최고의 해결방안이라 맹신하는 개발자들의 경우 남발되는 상속으로 늘어나는 코딩량을 감당하지 못하는 경우가 발생한다. 상속보다는 객체작성이라는 형식으로 실행중에 클래스를 꾸미는(데코레이션) 방법을 이용하게 되면 원래 클래스의 코드는 전혀 바꾸지 않고도 생성된 객체에 새로운 임무를 부여할 수 있다. 이를 세련된 방법으로 가능하게 하는 것이 디자인 패턴중 많이 사용되는 데코레이터 패턴이다.

클래스 개수가 폭발적으로 증가하는 예

  • 대형마트의 상품 판매를 프로그램화 하는 경우

    1. 상품이라는 최상위 클래스가 있고 금액을 표시하는 cost()라는 메소드가 오버라이딩
    2. 상품이 추가 될 때마다 상품을 상속받은 인스턴스 객체를 작성해야 하고 해당 객체의 cost() 메소드에 금액을 추가해 줘야 함.
    3. 상품이 추가되거나 각 상품들의 가격이 변경될 때마다 각 상품 클래스의 cost() 메소드의 금액을 변경해 줘야 함.
  • OCP(Open-Closed Principle)디자인 원칙에 위배 됨.

    • OCP : 클래스는 확장에 대해서는 여려 있어야 하지만 코드 변경에 대해서는 닫혀 있어야 함.
    • 코드에서 확장해야 할 부분을 선택할 때는 세심한 주의를 기울여야 함. 무조건 OCP를 적용하는 것은 시간 낭비가 될 수도 있고, 괜히 쓸 데 없는 일을 하는 것일 수도 있음. 결과적으로 불필요하게 복잡하고 이해하기 힘든 코드만 만들게 되는 부작용이 있을 수 있음.

데코레이터 패턴의 정의

  • 데코레이터 패턴에서는 객체에 추가적인 요건을 동적으로 첨가한다. 데코레이터는 서브클래스를 만드는 것을 통해서 기능을 유연하게 확장할 수 있는 방법을 제공한다.
  • 데코레이터가 적용된 예 (자바 I/O):
    java.io 패키지에는 무수히 많은 클래스들로 쉽게 접근할 수 없을 것 같지만 대부분이 [[데코레이터 패턴]을 바탕으로 만들어져 있어 두려워 할 필요는 없다.
  • 대표 자바 I/O 클래스 :
    • FileInputStream (데코레이터로 포장될 구성요소)
      • BufferedInputStream (구상 데코레이터. 속도 향상과 라인구분 기능 추가)
        • LineNumberInputStream : (구상 데코레이터. 행번호 추가)
0.0.1_20210630_7_v33