1. 컴포짓 패턴 이란?

- 그룹 전체와 개별 객체를 동일하게 처리할 수 있는 패턴
- 클라이언트 입장에서는 ‘전체’나 ‘부분’이나 모두 동일한 컴포넌트로 인식할 수는 계층 구조 를 만든다. (Part-Whole Hierarchy)
2. 컴포짓 패턴 사용 목적
개별 객체와 그룹을 똑같이 다루기 위해서
예시: 파일 시스템
- 개별 객체: 파일
- 그룹: 폴더 (파일들을 담고 있음)
// 컴포짓 패턴으로 구현한다면 둘 다 똑같은 방식으로 처리 가능(파일 크기 구학, 압축하기, 삭제하기 등)
// 크기 구하기
file.getSize(); // 파일 크기
folder.getSize(); // 폴더 안 모든 파일 크기 합계
// 압축하기
file.zip(); // 파일 압축
folder.zip(); // 폴더 안 모든 파일 압축
//삭제하기
file.delete(); // 파일 삭제
folder.delete(); // 폴더와 안의 모든 파일 삭제
장점:
- 클라이언트는 파일인지 폴더인지 신경 안 써도 됨
- 같은 메서드로 개별/그룹 모두 처리 가능
- 복잡한 구조를 단순하게 다룰 수 있음
핵심: "하나든 여러 개든 똑같이 처리하고 싶을 때" 사용하는 패턴
3. 컴포짓 패턴 요약
- 컨테이너 클래스와 그 안에 속한 개별 객체들을 하나의 인터페이스로 상속시켜서, 컨테이너든 개별 객체든 상관없이 같은 메서드로 처리할 수 있게 하는 패턴
- 가정
- 예시를 들면 박스와, 박스 안에 담을 내용물이 있다고 가정
- 가격을 더하는 메서드가 있다고 가정
- 클라이언트는 메서드에 넣는 것에 대한 가격을 반환한다는 사실만 알고 있음
- 동작방식
- 메서드에 매개변수를 넣는다(그룹을 넣든 객체를 넣든 상관 없음)
- 박스를 넣으면 : 박스에 담긴 물건 전체의 가격(그룹에 관련된 것)
- 내용물 넣으면 : 내용물의 가격(개별 객체)을 반환
- 장점
- 복잡한 트리 구조를 편리하게 사용할 수 있다.
- 다형성과 재귀를 활용할 수 있다.
- 클라이언트 코드를 변경하지 않고 새로운 엘리먼트 타입을 추가할 수 있다.
- 단점
- 트리를 만들어야 하기 때문에 (공통된 인터페이스를 정의해야 하기 때문에) 지나치게 일반화 해야 하는 경우도 생길 수 있다.
4. 깃허브 링크