-
[JAVA]객체 지향 디자인 패턴 - Composite Pattern(컴포지트 패턴)프로그래밍/Java 2022. 3. 29. 16:31반응형
Composite Pattern이란?
- Composite는 '합성물', '혼합', '혼성' 등 이라는 뜻을 가지고 있음
- 합성한 객체들의 집합이라는 개념으로 이해하면 됨
- 컴포지트 패턴은 트리구조를 작성하고 싶을 때 사용하며, 전체- 부분 관계를 표현하는 것이다.
- 폴더 시스템과 같다고 보면 된다. 폴더를 하나에 두고 이 폴더는 다른 폴더 안에 들어갈 수도 있고, 하위 계층의 객체들도 가지고 있을 수 있다.
Composite Pattern Structure(장식자 패턴 구조)이란?
- 상위 클래스(Component)를 두고 하위에 Leaf들을 둔다.
- 하위 Leaf들은 Composite형태로 Leaf들을 담아두는 복합체 일 수도 있고, 그냥 단순 하나의 Leaft일 수도 있다.
- 하위 Leaf들은 동작하는 메소드를 상속받아 재정의 하여 사용한다.
- 위와 같은 구조가 depth를 가진다면 아래와 같은 구조를 가질 수 있다.
Composite Pattern Example
출처. 얄팍한 코딩사전
- FileSystem을 Composite 패턴으로 정의 해 보자.
- Folder가 2개 있고 한 폴더는 상위 폴더 한에 있으며, 상위 폴더는 하나의 파일도 가지고 있다.
- 하위 폴더에는 2개의 파일을 가지고 있다.
- 위와 같은 경우를 코딩하여 작성해 보고 삭제까지 하는 프로그래밍을 해보자.
FileSystem 인터페이스
public interface FileSystem { public int getSize(); public void remove(); }
File 객체 클래스
public class File implements FileSystem{ private String name; private int size; public File(String name, int size) { } @Override public int getSize() { System.out.println(name + "파일 크기 : " + size); return size; } @Override public void remove() { System.out.println(name + "파일 삭제"); } }
Folder 객체 클래스
public class Folder implements FileSystem{ private String name; private ArrayList<FileSystem> includeds = new ArrayList<>(); public Folder (String name) { name = name; } public void add(FileSystem fileSystem) { includeds.add(fileSystem); } @Override public int getSize() { int total = 0; for(FileSystem included : includeds) { total += included.getSize(); } System.out.println(name + "폴더 크기 : " + total); System.out.println("-- - - - -"); return total; } @Override public void remove() { for(FileSystem included: includeds) { included.remove(); } System.out.println(name + "폴더 삭제"); System.out.println("------------"); } }
- Folder에는 ArrayList를 이용하여 파일들이나 폴더들을 관리 할수 있도록 작성되어져 있는걸 볼 수 있다.(다형성 원리)
- 이 ArrayList를 이용하여 리스트안에 객체들의 합을 구해 size를 반환해 줄 수 있으며, 제거도 할 수 있다.
- 상위 폴더를 삭제한다고 가정해 볼 때, 하위에 폴더가 3개가 있다고 가정해 보아도 included.remove라는 메소드를 호출하게 되어 똑같이 for문을 돌리게 되므로 하위 폴더를 삭제하는 로직이 똑같이 사용가능하게 되어져있다.
public class CompositeTest { public static void main(String[] args) { Folder schoolFolder = new Folder("학교"); Folder grade1Folder = new Folder("1학년"); Folder grade2Folder = new Folder("2학년"); schoolFolder.add(grade1Folder); schoolFolder.add(grade2Folder); File enterPhoto = new File("입학사진", 256); grade1Folder.add(enterPhoto); Folder sem1Folder = new Folder("1학기"); Folder sem2Folder = new Folder("1학기"); grade2Folder.add(sem1Folder); grade2Folder.add(sem2Folder); File lecturePlan = new File("강의계획서", 120); sem1Folder.add(lecturePlan); Folder projFolder = new Folder("프로젝트"); sem2Folder.add(projFolder); File draft = new File("드래프트", 488); File finalResult = new File("결과물", 560); projFolder.add(draft); projFolder.add(finalResult); schoolFolder.getSize(); schoolFolder.remove(); } }
Composite Pattern 사용 이유
- 내부파일들을 검색하는 로직을 만들 때 사용 가능하다.
- 하나의 묶음으로 객체를 관리하고 싶을 때 사용한다.
반응형'프로그래밍 > Java' 카테고리의 다른 글
[JAVA Intellij] Maven-Profile을 적용하여 Resources폴더 환경에 맞게 관리하기 (0) 2022.05.24 [JAVA]객체 지향 디자인 패턴 - Mediator Pattern(중재자 패턴) (0) 2022.03.28 [JAVA]객체 지향 디자인 패턴 - Factory Pattern(팩토리 패턴) (0) 2022.03.28 [JAVA]객체 지향 디자인 패턴 - Decorator Pattern(장식자 패턴) (0) 2022.03.24 [JAVA]객체 지향 디자인 패턴 - Template Method Pattern(탬플릿 메소드 패턴) (0) 2022.03.23