일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- 스프링
- 기술면접대비
- jpa
- 운영체제
- Application
- 개발자면접
- 자바8
- 백엔드면접
- 자바면접
- 배타락
- 기술면접
- 개발자기술면접
- equals
- 알고리즘
- DB
- 공유락
- 면접준비
- 데이터베이스
- 객체지향언어
- Spring
- 자바기술면접
- lock
- stream
- 자바
- 스트림
- 백엔드
- java
- http
- hashcode
- 네트워크
Archives
- Today
- Total
IT인으로 살아남기
자바에서 1급 컬렉션에 대해 알아보기 본문
728x90
1급 컬렉션(First-Class Collection)이란?
1급 컬렉션은 컬렉션(List, Set, Map 등)을 감싸는 클래스로, 해당 컬렉션과 관련된 로직을 해당 클래스에 캡슐화하여 관리하는 설계 패턴입니다. 객체 지향 설계에서 컬렉션을 더 안전하고 의미 있게 사용하기 위해 도입되는 개념으로, 컬렉션 자체를 무분별하게 사용하는 것을 방지하고 코드의 유지보수성을 높이는 데 목적이 있습니다.
1급 컬렉션의 특징
- 컬렉션을 필드로만 가진다.
- 1급 컬렉션은 컬렉션 이외의 다른 필드를 가지지 않습니다.
- 예: List<Item>을 필드로 가지는 클래스.
- 불변성을 유지한다.
- 컬렉션 내부 데이터는 외부에서 직접 수정할 수 없도록 하고, 데이터의 변경은 메서드를 통해서만 이루어집니다.
- 예를 들어, 추가, 삭제 등의 작업은 메서드를 통해 제어합니다.
- 비즈니스 로직 캡슐화
- 컬렉션과 관련된 모든 로직은 1급 컬렉션 내부에서 처리합니다.
- 외부 클래스는 컬렉션에 직접 접근하지 않고, 1급 컬렉션을 통해 간접적으로 사용합니다.
- 데이터의 의미 부여
- 단순히 List나 Map과 같은 컬렉션만 사용하는 대신, 해당 컬렉션을 의도적으로 감싸 의미를 부여합니다.
- 예: List<String> 대신 Names 클래스 사용.
1급 컬렉션의 장점
- 응집도 증가
- 컬렉션과 관련된 로직이 하나의 클래스에 모여 있어 응집도가 높아지고, 관리가 용이해집니다.
- 불변성 보장
- 외부에서 컬렉션을 직접 수정하지 못하게 함으로써 데이터의 일관성을 유지할 수 있습니다.
- 의미 있는 타입 제공
- 단순한 컬렉션 대신 도메인에 맞는 의미 있는 클래스를 사용함으로써 코드의 가독성과 유지보수성이 증가합니다.
- 컬렉션 관련 로직의 중복 제거
- 여러 곳에서 동일한 컬렉션 관련 로직을 중복해서 작성할 필요가 없습니다.
- 테스트 용이성
- 비즈니스 로직이 캡슐화되어 있어 단위 테스트 작성이 용이합니다.
1급 컬렉션 예제 코드
1. 일반적인 컬렉션 사용 방식
public class Order {
private List<Item> items;
public Order(List<Item> items) {
this.items = items;
}
public List<Item> getItems() {
return items;
}
}
이 방식에서는 Order 외부에서 items를 직접 조작할 수 있어 데이터가 변경될 위험이 있습니다.
2. 1급 컬렉션으로 리팩토링
// 1급 컬렉션: Items
public class Items {
private final List<Item> items;
public Items(List<Item> items) {
this.items = new ArrayList<>(items); // 방어적 복사
}
// 컬렉션 관련 로직 캡슐화
public int totalPrice() {
return items.stream().mapToInt(Item::getPrice).sum();
}
public boolean contains(Item item) {
return items.contains(item);
}
public Items addItem(Item item) {
List<Item> newItems = new ArrayList<>(items);
newItems.add(item);
return new Items(newItems);
}
public List<Item> toList() {
return Collections.unmodifiableList(items); // 불변 리스트 반환
}
}
// 사용하는 클래스: Order
public class Order {
private final Items items;
public Order(Items items) {
this.items = items;
}
public int getTotalPrice() {
return items.totalPrice();
}
}
1급 컬렉션의 주요 활용 사례
- 도메인 주도 설계(DDD)
- 도메인의 복잡한 비즈니스 로직을 1급 컬렉션으로 캡슐화.
- 불변 객체 설계
- 데이터 무결성을 유지하기 위해 사용.
- 객체 간 결합도 감소
- 컬렉션과 관련된 로직이 1급 컬렉션 내부로 모여 코드가 더 명확해짐.
1급 컬렉션을 적용할 때 주의점
- 과도한 추상화 지양
- 너무 작은 컬렉션까지 모두 1급 컬렉션으로 만들면 오히려 복잡도가 증가할 수 있습니다.
- 컬렉션 크기에 대한 고려
- 컬렉션의 크기가 매우 큰 경우 성능에 주의하며, 필요에 따라 별도 최적화가 필요합니다.
1급 컬렉션은 객체 지향 설계의 원칙을 따르며, 코드의 품질과 유지보수성을 높이는 데 유용합니다. 다만 모든 상황에 무조건 적용하기보다는 도메인의 복잡도와 요구 사항을 고려해 선택적으로 사용하는 것이 좋습니다.
728x90
'Java' 카테고리의 다른 글
[Java/자바/면접] 얕은 복사와 깊은 복사에 대해서 (1) | 2025.01.31 |
---|---|
[Java] equals() 와 hashCode() 메서드의 관계 그리고 오버라이딩에 대해서 (0) | 2025.01.15 |
자바 객체지향 생활체조 9원칙 (0) | 2025.01.10 |
[Java] 자바 버전 (7, 8, 11, 17)에 대한 특징 정리 (0) | 2025.01.09 |
Java Stream API에 대해 알아보기 (0) | 2025.01.07 |