본문 바로가기

CS

일급 컬렉션이 무엇인가요?

일급 컬렉션은 단일 컬렉션(List, Set 등)을 감싸는 클래스로, 컬렉션과 관련된 비즈니스 로직을 책임지고 관리하는 객체입니다. 아래 코드는 Order의 List 자료구조를 감싼 Orders가 일급 컬렉션의 예시입니다.

 

public class Orders {
    private final List<Order> orders;

    public Orders(List<Order> orders) {
        validate(orders);
        this.orders = new ArrayList<>(orders);
    }

    public void add(Order order) {
        ...
    }

    public double getTotalAmount() {
        ...
    }

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

 


왜 일급 컬렉션을 써야 하나요?

 

 

응집도를 높인다

  • List<Order> 대신 Orders를 쓰면 해당 컬렉션과 관련된 모든 책임이 하나의 클래스에 모이므로 도메인에 가까운 코드 구조를 만들 수 있습니다.

 

캡슐화

  • List를 직접 노출하지 않고 불변 컬렉션으로 반환하여 데이터 보호를 합니다.
  • 불필요한 API 사용을 막고, 의도치 않은 변경을 방지합니다.

 

비즈니스 의미를 표현할 수 있다

  • Orders, CartItems, Tags, Comments 등 의미 있는 이름을 부여함으로써 코드의 의도와 도메인을 명확하게 표현할 수 있습니다.

 

 


추가 개념

 

불변 객체

  • 일급 컬렉션 내부 컬렉션을 Collections.unmodifiableList()로 노출하는 것은 불변 객체의 한 예입니다.
  • 불변 객체는 동시성 문제를 줄이고, 참조로 인한 사이드 이펙트를 줄입니다.
    • 불변 객체는 값이 바뀌지 않기에 여러 스레드가 동시에 접근해도 안전하다
    • 참조를 공유해도 값이 변하지 않아 사이드 이팩트가 없다
  • 불변성과 일급 컬렉션을 같이 사용하면 안정성과 가독성이 높아집니다.

객체지향 원칙 - 단일 책임 원칙(SRP)

  • List<Order> 대신 Orders라는 객체로 비즈니스 로직을 포함시키면 컬렉션에 대한 책임이 분리됩니다.

디미터 법칙

  • orderService.getOrders().getList().get(0).getSomething() 같은 깊은 체이닝을 줄이고, 일급 컬렉션에 메시지를 보내도록 유도합니다.
  • 즉, 내부 구조를 알 필요 없이 메시지만 전달하도록 설계할 수 있습니다.