1. 1급 컬렉션?
1급 컬렉션은 컬렉션(List, Set, Map 등)과 관련된 로직을 객체로 캡슐화한 설계 패턴. 단순히 컬렉션을 직접 사용하지 않고, 컬렉션을 감싸는 객체를 만들어 그 안에 데이터를 관리하고 관련된 로직을 함께 넣는 방식
2. 1급 컬렉션 vs VO(Value Object)
구분 | 1급 컬렉션 | VO(Value Object) |
의미 | 컬렉션을 감싸는 객체 | 단일 값을 표현하는 객체 |
구조 | 컬렉션(List,Map,Set 등)을 내부에 포함 | 단일 값(숫자, 문자열 등)을 내부에 포함 |
목적 | 컬렉션과 관련된 로직 캡슐화 | 값 자체의 의미 부여 및 불변성 유지 |
3. 특징
- 컬렉션을 포함한 클래스
- 컬렉션(List, Set, Map 등)을 감싸는 하나의 객체로 설계
- 컬렉션 외에 다른 필드는 존재해선 안됨
- 불변성 유지
- 컬렉션은 final로 선언하여 외부에서 변경할 수 없도록 만듦
- 컬렉션을 변경할 경우 새로운 객체를 생성하여 반환
- 비즈니스 로직 캡슐화
- 컬렉션에 관련된 모든 동작을 1급 컬렉션 내부에서 처리
- 외부에서 컬렉션의 구조를 직접 다루지 못하게 하여 캡슐화 유지
- 1급 객체의 특징을 가짐
- 생성자로 전달받은 데이터를 내부 컬렉션으로 관리
- 객체를 함수의 인자로 넘기거나 반환값으로 사용 가능
4. 구현
컬렉션을 멤버 변수로 가지는 클래스로 정의하고, 해당 컬렉션에 대한 조작을 제어하는 메서드를 제공. 이를 통해 컬렉션에 직접적인 접근을 제한하고, 관련 로직을 캡슐화할 수 있음.
public class ToDoList {
private final List<ToDo> todos;
public ToDoList(List<ToDo> todos) {
this.todos = todos;
}
public void addToDo(ToDo todo) {
todos.add(todo);
}
public List<ToDo> getToDoList() {
return todos;
}
}
이와 같이 할일 목록 추가에 대한 조작을 캡슐화하고, 외부에서는 결과만 조회할 수 있게 할 수 있다.
5. 장점
- 컬렉션의 직접적인 노출을 막음
- 내부 컬렉션을 외부에서 수정할 수 없도록 Collections.unmodifiableList를 사용하거나 방어적 복사를 통해 보호합니다.
- 의미를 부여한 클래스 설계
- 단순한 List <Student>가 아닌 Students라는 클래스를 만들어, 이 컬렉션이 무엇을 의미하는지 명확히 전달합니다.
- 도메인 로직을 한 곳에서 관리
- 컬렉션과 관련된 로직을 1급 컬렉션 내부에 포함시켜, 비즈니스 로직이 흩어지는 것을 방지합니다.
- 확장성과 유지보수성 향상
- 새로운 로직이 추가되더라도 1급 컬렉션 내부에서 처리할 수 있어 유지보수가 용이합니다.
6. 단점
- 성능상의 이슈 발생 가능
- 컬렉션의 상태를 변경할 때마다 새로운 객체를 생성해야 하므로, 객체 생성 비용이 증가할 수 있다.
- 코드의 복잡성 증가
- 각 컬렉션마다 별도의 클래스를 정의해야 하기 때문이다.
7. 주의점
- 불필요한 래핑 금지
- 컬렉션이 너무 단순한 경우(예: 몇 가지 간단한 조회 정도만 필요한 경우)에는 1급 컬렉션을 만들지 않아도 됩니다.
- 도메인 의미를 고려
- 도메인에서 컬렉션이 중요한 역할을 한다면 1급 컬렉션을 사용해 의미를 부여합니다.
- 불변성을 유지
- 내부 컬렉션은 절대 수정되지 않도록 설계합니다.
'개발 개념' 카테고리의 다른 글
단위 테스트와 테스트 더블 (0) | 2025.02.13 |
---|---|
클린아키텍처 (0) | 2025.02.11 |
객체지향 생활 체조 원칙 9가지 (0) | 2025.02.11 |
VO(Value Object) (0) | 2025.02.11 |
객체지향 (3) | 2025.02.07 |