본문 바로가기
디자인패턴

[디자인패턴] 컴포지트 패턴

by 붕어사랑 티스토리 2022. 7. 8.
반응형

 

컴포지트 패턴(Composite pattern)이란 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 한다.

 

 

처음 읽어보고 나의 반응...

 

아니 시방 이게 뭔소리여?

 

 

 

자 이제 이 컴포지트 패턴을 이해해보자

 

 

컴포지트 패턴과 가장 유사한 예시로는 윈도우 파일시스템을 떠올릴 수 있다. File 이라는게 있고 Directory라는게 있다.

 

여러분이 알다시피 디렉토리는 파일을 담는다.

 

그럼 아래와 같이 코드로 나타낼 수 있겠다

Class File{
    public void operation(){}
}

class Directory{
    public List<File> lists;
    
    public void operation(){}
    
    public void add(File f){
        list.add(f);
    }
    
    public void remove(File f){
        list.add(f);
    }
    
    public File getChild(int index){
        return list.at(index);
    }
}

 

 

 

 

자 여기서 정의를 다시보자

 

컴포지트 패턴(Composite pattern)이란 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 한다.

 

여기서 단일객체는 File을 의미하고 복합객체는 Directory를 의미한다.

즉 복합개체란 단일객체를 여러개 들고다니는 객체이다.

 

파일 시스템에 비유하면 디렉토리는 여러개의 파일을 들고 다닌다.

 

 

 

여기서 하나 더 여러분이 아는 사실은 디렉토리는 다른 디렉토리를 담을 수 있다. 즉

 

디렉토리는 파일과 다른 디렉토리를 동일 취급한다   <---> 단익객체와 복합객체 모두 동일하게 다루도록 한다

 

라는 의미가 되시겠다.

 

 

 

 

 

 

그림을 다시보자

 

여기서 Leaf는 File을 의미하고 Composite는 Directory를 의미한다.

 

즉 Leaf와 Composite를 동일하게 취급하겠다는 뜻이다!!!

 

Leaf와 Composite를 동일하게 취급하려면 어떻게 해야될까?

 

바로 두 클래스를 모두 Component를 상속받게 만들면 된다!

 

 

 

 

interface Component{
}

Class File extends Component {
    public void operation(){}
}

class Directory extends Component {
    public List<Component> lists;
    
    public void operation(){}
    
    public void add(Component f){
        list.add(f);
    }
    
    public void remove(Component f){
        list.add(f);
    }
    
    public Component getChild(int index){
        return list.at(index);
    }
}

위에처럼 코드를 고치면 이제 Directory는 다른 Directory를 담을 수 있다!!!

 

 

 

 

 

 

 

자 그럼 마직으로 이 패턴을 사용하면 무슨 이점을 얻을 수 있을 까?

 

 

 

컴포지트 패턴(Composite pattern)이란 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 한다.

 

 

저 노란줄이 무슨의미인지 잘 감이 안잡힌다.

하지만 여러분이 디렉토리와 파일의 구조를 떠올려보면 쉽게 이해할 수 있을것이다!

 

 

 

폴더와 파일의 관계는 위 그림처럼 트리구조로 나타낼 수 있다!

 

 

자 그럼 아래 말이 이제 감이 잡히는가?

 

 

객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴

 

 

위 그림과 설명이 이제 완벽하게 이해가 될 것이다.

 

 

Leaf와 Composite를 폴더와 파일의 트리구조 처럼 나타내고 싶을 때 컴포지트 패턴을 사용하는 것이다!!

반응형

'디자인패턴' 카테고리의 다른 글

[디자인패턴] 브릿지 패턴이란  (0) 2022.07.04

댓글