본문 바로가기
Back-End

일급 컬렉션

by 코젼 2025. 3. 7.
728x90
반응형

일급 컬렉션(First-Class Collection)

  • 하나의 컬렉션을 감싸는 클래스를 만들고, 해당 클래스에서 컬렉션과 관련된 비즈니스 로직을 관리하는 패턴

아래 코드 중에서 Order의 List 자료구조를 감싼 Orders가 일급 컬렉션의 예시입니다.

  • 컬렉션을 Wrapping 하면서, 그 외 다른 멤버 변수가 없는 상태
// 일급 컬렉션
public class Orders {

    private final List<Order> orders;

    public Orders(List<Order> orders) {
        validate(orders); // 검증 수행
        ...
    }

    public void add(Order order) {
        if (order == null) {
            throw new IllegalArgumentException("Order cannot be null");
        }
        orders.add(order);
    }

    public List<Order> getAll() {
        return Collections.unmodifiableList(orders);
    }

    public double getTotalAmount() {
        return orders.stream()
                     .mapToDouble(Order::getAmount)
                     .sum();
    }
}

public class OrderService {

    private final Orders orders = new Orders();

    public void addOrder(Order order) {
        orders.add(order);
    }

    public Orders getOrders() {
        return orders;
    }

    // 추가 비즈니스 로직...
}

장점

  • 일급 컬렉션 클래스에 로직포함하거나 비즈니스에 특화된 명확한 이름을 부여할 수 있다.
  • 불필요한 컬렉션 API를 외부로 노출하지 않도록 할 수 있다.
  • 컬렉션을 변경할 수 없도록 만든다면 예기치 않은 변경으로부터 데이터보호할 수 있다.
    • final재할당금지하는 것이며, 불변보장하지 않는다.

예시

// 사용 X
Map<String, String> map = new HashMap<>();
map.put("1", "A");
map.put("2", "B");
map.put("3", "C");

// 일급 컬렉션 사용 후 (Wrapping 진행)
public class GameRanking {

    private Map<String, String> ranks;

    public GameRanking(Map<String, String> ranks) {
        this.ranks = ranks;
    }
}

 

728x90
반응형

댓글