IT인으로 살아남기

자바에서 1급 컬렉션에 대해 알아보기 본문

Java

자바에서 1급 컬렉션에 대해 알아보기

seoeunpapa 2025. 1. 6. 00:15
728x90

 

1급 컬렉션(First-Class Collection)이란?

1급 컬렉션은 컬렉션(List, Set, Map 등)을 감싸는 클래스로, 해당 컬렉션과 관련된 로직을 해당 클래스에 캡슐화하여 관리하는 설계 패턴입니다. 객체 지향 설계에서 컬렉션을 더 안전하고 의미 있게 사용하기 위해 도입되는 개념으로, 컬렉션 자체를 무분별하게 사용하는 것을 방지하고 코드의 유지보수성을 높이는 데 목적이 있습니다.


1급 컬렉션의 특징

  1. 컬렉션을 필드로만 가진다.
    • 1급 컬렉션은 컬렉션 이외의 다른 필드를 가지지 않습니다.
    • 예: List<Item>을 필드로 가지는 클래스.
  2. 불변성을 유지한다.
    • 컬렉션 내부 데이터는 외부에서 직접 수정할 수 없도록 하고, 데이터의 변경은 메서드를 통해서만 이루어집니다.
    • 예를 들어, 추가, 삭제 등의 작업은 메서드를 통해 제어합니다.
  3. 비즈니스 로직 캡슐화
    • 컬렉션과 관련된 모든 로직은 1급 컬렉션 내부에서 처리합니다.
    • 외부 클래스는 컬렉션에 직접 접근하지 않고, 1급 컬렉션을 통해 간접적으로 사용합니다.
  4. 데이터의 의미 부여
    • 단순히 List나 Map과 같은 컬렉션만 사용하는 대신, 해당 컬렉션을 의도적으로 감싸 의미를 부여합니다.
    • 예: List<String> 대신 Names 클래스 사용.

1급 컬렉션의 장점

  1. 응집도 증가
    • 컬렉션과 관련된 로직이 하나의 클래스에 모여 있어 응집도가 높아지고, 관리가 용이해집니다.
  2. 불변성 보장
    • 외부에서 컬렉션을 직접 수정하지 못하게 함으로써 데이터의 일관성을 유지할 수 있습니다.
  3. 의미 있는 타입 제공
    • 단순한 컬렉션 대신 도메인에 맞는 의미 있는 클래스를 사용함으로써 코드의 가독성과 유지보수성이 증가합니다.
  4. 컬렉션 관련 로직의 중복 제거
    • 여러 곳에서 동일한 컬렉션 관련 로직을 중복해서 작성할 필요가 없습니다.
  5. 테스트 용이성
    • 비즈니스 로직이 캡슐화되어 있어 단위 테스트 작성이 용이합니다.

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급 컬렉션의 주요 활용 사례

  1. 도메인 주도 설계(DDD)
    • 도메인의 복잡한 비즈니스 로직을 1급 컬렉션으로 캡슐화.
  2. 불변 객체 설계
    • 데이터 무결성을 유지하기 위해 사용.
  3. 객체 간 결합도 감소
    • 컬렉션과 관련된 로직이 1급 컬렉션 내부로 모여 코드가 더 명확해짐.

1급 컬렉션을 적용할 때 주의점

  1. 과도한 추상화 지양
    • 너무 작은 컬렉션까지 모두 1급 컬렉션으로 만들면 오히려 복잡도가 증가할 수 있습니다.
  2. 컬렉션 크기에 대한 고려
    • 컬렉션의 크기가 매우 큰 경우 성능에 주의하며, 필요에 따라 별도 최적화가 필요합니다.

1급 컬렉션은 객체 지향 설계의 원칙을 따르며, 코드의 품질과 유지보수성을 높이는 데 유용합니다. 다만 모든 상황에 무조건 적용하기보다는 도메인의 복잡도와 요구 사항을 고려해 선택적으로 사용하는 것이 좋습니다.

728x90