컴퍼지트(Composite) 패턴은 객체들을 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴입니다. 이 패턴은 개별 객체와 그 객체들을 조합한 복합 객체를 동일한 방식으로 다룰 수 있도록 해줍니다. 자바 코드를 통해 컴퍼지트 패턴의 예시를 살펴보겠습니다.
가정해보겠습니다. 우리는 조직 구조를 표현하는 프로그램을 개발하고 있습니다. 조직은 부서(Department)와 직원(Employee)으로 구성되어 있습니다. 부서는 여러 개의 부서와 직원을 가질 수 있습니다. 컴퍼지트 패턴을 사용하여 조직 구조를 표현해보겠습니다.
먼저, 조직 구성원을 나타내는 Component 인터페이스를 정의합니다:
public interface Component {
void showDetails();
}
다음으로, 부서(Department) 클래스를 만듭니다. 이 클래스는 Component를 구현하며, 부서 이름과 부서에 속한 구성원들을 저장하는 리스트를 가지고 있습니다:
import java.util.ArrayList;
import java.util.List;
public class Department implements Component {
private String name;
private List<Component> members;
public Department(String name) {
this.name = name;
this.members = new ArrayList<>();
}
public void addMember(Component member) {
members.add(member);
}
public void removeMember(Component member) {
members.remove(member);
}
@Override
public void showDetails() {
System.out.println("Department: " + name);
for (Component member : members) {
member.showDetails();
}
}
}
Department 클래스는 addMember() 메서드와 removeMember() 메서드를 사용하여 부서에 구성원을 추가하거나 제거할 수 있습니다. showDetails() 메서드에서는 부서 이름을 출력하고, 속한 구성원들의 세부 정보를 출력합니다.
마지막으로, 직원(Employee) 클래스를 만듭니다. 이 클래스는 Component를 구현하며, 직원의 이름과 역할을 가지고 있습니다:
public class Employee implements Component {
private String name;
private String role;
public Employee(String name, String role) {
this.name = name;
this.role = role;
}
@Override
public void showDetails() {
System.out.println("Employee: " + name + " (" + role + ")");
}
}
Employee 클래스는 showDetails() 메서드에서 직원의 이름과 역할을 출력합니다.
이제 컴퍼지트 패턴을 사용하여 조직 구조를 표현하는 예시 코드를 작성합니다:
public class Main {
public static void main(String[] args) {
// 부서 생성
Department engineering = new Department("Engineering");
// 직원 생성
Employee john = new Employee("John", "Engineer");
Employee jane = new Employee("Jane", "Engineer");
Employee mark = new Employee("Mark", "Manager");
// 부서에 직원 추가
engineering.addMember(john);
engineering.addMember(jane);
engineering.addMember(mark);
// 하위 부서 생성
Department development = new Department("Development");
Employee mike = new Employee("Mike", "Developer");
Employee lisa = new Employee("Lisa", "Developer");
// 하위 부서에 직원 추가
development.addMember(mike);
development.addMember(lisa);
// 상위 부서에 하위 부서 추가
engineering.addMember(development);
// 조직 구조 출력
engineering.showDetails();
}
}
위 예시에서는 Department 클래스와 Employee 클래스를 사용하여 조직 구조를 표현합니다. 부서와 직원을 생성하고, 부서에 구성원을 추가합니다. Department 클래스는 자신의 구성원들을 관리하며, showDetails() 메서드를 사용하여 조직 구조를 출력합니다.
실행 결과는 다음과 같습니다:
Department: Engineering
Employee: John (Engineer)
Employee: Jane (Engineer)
Employee: Mark (Manager)
Department: Development
Employee: Mike (Developer)
Employee: Lisa (Developer)
이 예시에서는 컴퍼지트 패턴을 사용하여 조직 구조를 표현하였습니다. Department 클래스와 Employee 클래스는 동일한 방식으로 다루어지며, 조직 구조의 확장과 유지보수에 용이한 구조를 제공합니다.