컴포짓 패턴(Composite Pattern)

INSANEZINDOL·2022년 3월 2일
0

Design Pattern

목록 보기
10/10
post-thumbnail

개요

전체와 부분을 동일시해서 재귀적인 구조를 만들기 위한 디자인 패턴

  • 맥에서는 파인더, 윈도우에서는 폴더, 컴퓨터의 파일 시스테에서는 '디렉토리' 라는 것이 있습니다. 이 디릭토리는 개발당시 프로젝트의 패키지(package)와 동일하게 그 안에 또다른 디렉토리가 있을 수도 있고 파일이 있을수도 있습니다. 이처럼 디렉토리 내부에 또 디렉토리가 있는 구조인 재귀적인 구조를 만들어 냅니다.
    디렉토리와 파일의 공통점은 둘 다 디렉토리 안에 넣을 수 있다는 것이고 이 둘을 합쳐 '디렉토리 엔트리' 라고 부르기도 합니다.
    예를 들어, 하나의 디렉토리를 가지고 내부에 무엇이 있는지 차례대로 조사할 경우 조사대상은 디렉토리일수도있고, 파일일수도 있습니다. 다시 말하자면 '디렉토리 엔트리' 를 차례대로 조사하는 것이죠.
    이렇게 두 종류를 하나의 '디렉토리 엔트리' 로 같은 종류로 취급할 경우 디렉토리 안에는 다른 디렉토리를 넣을수도 있고 파일을 넣을수도 있습니다. 이 행위는 그 다음에도 동일합니다. 즉, 재귀적인 구조를 만들 수 있다는 것입니다.

역할

  1. Leaf(예제의 File)
    ⇒ '내용물'을 표시하는 역할을 하며 내부에는 다른 것을 넣을 수 없습니다.
  2. Composite(예제의 Directory)
    ⇒ '그릇'을 나타내는 역할을 하며 디렉토리 엔트리(Leaf or Composite )를 넣을 수 있습니다.
  3. Component(예제의 Entry)
    ⇒ 디렉토리 엔트리 역할입니다 Leaf가 될 수도 있고 Composite가 될 수도 있습니다

참고 - 복수와 단수의 동일시(Composite)

  • 지금까지의 설명은 디렉토리와 파일을 동일시 한다고 했습니다만, 복수와 단수 역시 동일시 한다고 할 수 있습니다. 즉, 여러 개를 모아서 마치 하나인 것처럼 취급한다는 것입니다.

참고 - add메소드의 구현 방법

  • 예제에서는 Entry 클래스에서 add메소드를 정의하고 예외를 제공했습니다. 실제로 add메소드는 Directory에서만 사용할 수 있기에 Directory클래스 add메소드를 오버라이딩 해서 구현해놨습니다. 이처럼 add 메소드의 설치와 구현의 방법은 여러가지가 있습니다.

case 1 : Entry 클래스에서 구현 후 에러 처리

  • 이 케이스는 위 예제코드를 통해 확인할 수 있습니다. Entry클래스에 기본 로직으로 예외를 발생시키도록 해놓은 뒤 실제로 사용할 수 있는 Directory클래스에서는 오버라이딩해서 구현해놓고, FIle 클래스에서는 따로 오버라이딩을 해 구현하지 않았습니다. 그렇게 되면 Directory클래스에서 add를 호출하면 정상 동작을 하게 되고, File클래스에서는 Entry클래스를 상속받았기 때문에 add메소드 호출은 가능하지만 예외가 발생합니다.

case 2: Entry클래스에서 구현하고 아무것도 실행하지 않는다.

  • add 메소드는 Entry 클래스에서 구현하지만 에러로 처리하지 않는 방법도 있습니다. 그저 아무 로직수행 없이 끝나게 됩니다.

case 3: Entry 클래스에서 선언은 하지만 구현은 하지 않는다.

  • Entry클래스에서 add메소드를 추상 메소드로 선언하여 하위클래스에서는 필요한 경우 구현하고 필요치 않으면 에러로 처리하는 방법도 있습니다. 이 케이스를 선택하면 일관성을 가지고 불필요한 하위클래스의 작동을 결정할 수 있지만, 경우에 따라서는 필요하지 않은 클래스(File)에서도 정의해야하는 단점도 있습니다.

case 4: Directory 클래스에만 넣는다.

  • add 메소드를 Entry클래스에는 넣지 않고, 처음부터 필요한 Directory 클래스에 넣는 방법입니다.
    이 방법의 가장 큰 단점은 Directory 클래스를 Entry로 받아서 메소드를 실행 시킬 때 다시 Directory로 다운캐스팅을 해서 사용해야 합니다.
profile
Java Backend Developer

0개의 댓글