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

Kkd·2024년 11월 24일
0

매일메일 개념정리

목록 보기
6/93

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

일급 컬렉션은 하나의 컬렉션을 객체로 감싸고, 해당 컬렉션과 관련된 로직을 한 곳에서 관리하도록 설계한 객체를 의미합니다.
즉, 단일 컬렉션(List, Set, Map 등)만을 인스턴스 변수로 가지며, 이를 통해 컬렉션과 관련된 비즈니스 로직과 제약 조건을 한 곳에서 캡슐화합니다.


1. 일급 컬렉션의 특징

  1. 컬렉션만 포함

    • 내부적으로 컬렉션을 인스턴스 변수로 가지며, 다른 상태(변수)는 포함하지 않습니다.
  2. 불변성을 보장

    • 컬렉션을 수정할 수 없도록 설계하거나, 변경 시 새로운 객체를 생성하는 방식으로 관리합니다.
  3. 비즈니스 로직 캡슐화

    • 컬렉션과 관련된 모든 비즈니스 로직을 일급 컬렉션 내부에 정의하여 응집성을 높입니다.
    • 외부에서 컬렉션을 직접 조작하지 못하게 하고, 필요한 작업은 메서드로 제공합니다.
  4. 자체적인 유효성 검사

    • 컬렉션의 상태를 검증하고, 불변성을 유지하기 위해 제약 조건을 추가할 수 있습니다.
  5. 데이터에 이름 부여

    • 단순히 ListMap과 같은 컬렉션 객체를 사용하는 대신 의미 있는 클래스 이름으로 표현하여 코드 가독성과 의도를 명확히 합니다.

2. 일급 컬렉션의 장점

(1) 응집성 증가

  • 컬렉션과 관련된 로직이 한 곳에 모여 있어, 비즈니스 요구사항 변경에 쉽게 대응할 수 있습니다.

(2) 재사용성 증가

  • 중복되는 컬렉션 처리 로직을 제거하고, 일급 컬렉션을 재사용함으로써 코드 유지보수가 용이해집니다.

(3) 컬렉션 제약 조건 관리

  • 컬렉션의 상태와 무결성을 객체 내부에서 검증하므로 데이터의 신뢰성을 보장합니다.

(4) 의미 전달

  • 클래스 이름을 통해 컬렉션의 역할을 명확히 전달할 수 있습니다.

(5) 불변성 유지

  • 외부에서 컬렉션을 수정하지 못하도록 하여 사이드 이펙트를 방지합니다.

3. 일급 컬렉션 사용 예제

(1) 일반 컬렉션 사용 예

다음은 일반적으로 List를 사용하는 코드입니다:

class Order {
    private List<Item> items;

    public Order(List<Item> items) {
        this.items = items;
    }

    public List<Item> getItems() {
        return items;
    }
}
  • items에 대한 검증이나 추가 로직이 필요한 경우, 해당 로직이 분산될 가능성이 있습니다.
  • 이로 인해 응집성이 낮아지고 유지보수가 어려워질 수 있습니다.

(2) 일급 컬렉션 사용 예

Items라는 일급 컬렉션을 만들어 관리합니다:

class Items {
    private final List<Item> items;

    public Items(List<Item> items) {
        validate(items);
        this.items = new ArrayList<>(items); // 불변성 보장
    }

    private void validate(List<Item> items) {
        if (items == null || items.isEmpty()) {
            throw new IllegalArgumentException("아이템 리스트는 비어 있을 수 없습니다.");
        }
    }

    public int size() {
        return items.size();
    }

    public boolean contains(Item item) {
        return items.contains(item);
    }

    public List<Item> getItems() {
        return Collections.unmodifiableList(items); // 불변 리스트 반환
    }
}

OrderItems를 필드로 가지도록 변경됩니다:

class Order {
    private final Items items;

    public Order(Items items) {
        this.items = items;
    }

    public Items getItems() {
        return items;
    }
}
  • 컬렉션에 대한 제약 조건(예: 비어 있는지 검사)은 Items에서 관리됩니다.
  • 외부에서 items 컬렉션을 직접 수정할 수 없습니다.

4. 일급 컬렉션 사용 사례

(1) 주문 항목 관리

  • Order 객체가 다수의 Item 객체를 포함하는 경우, Items라는 일급 컬렉션으로 관리.

(2) 태그 관리

  • 게시물이나 상품이 여러 개의 태그를 가질 때, Tags라는 일급 컬렉션을 만들어 유효성 검사와 추가 로직을 캡슐화.

(3) 점수 목록

  • 학생의 점수 리스트를 관리할 때, Scores라는 일급 컬렉션을 사용하여 평균 계산, 최대/최소 점수 구하기 등의 로직을 처리.

5. 일급 컬렉션 사용 시 주의사항

  1. 불변성을 유지해야 함

    • 컬렉션을 직접 수정하지 못하게 하고, 외부에 제공할 때는 불변 컬렉션으로 반환.
  2. 컬렉션 외의 상태를 추가하지 않음

    • 컬렉션 관리에 집중하고, 다른 상태나 로직이 섞이지 않도록 설계.
  3. 지나친 사용 지양

    • 단순한 데이터 구조에서는 일급 컬렉션이 과도한 설계가 될 수 있으므로, 필요할 때만 사용.

6. 일급 컬렉션을 사용하지 않았을 때의 문제점

  • 컬렉션 관련 로직이 분산되어 코드 중복 및 유지보수 비용 증가.
  • 컬렉션의 상태 변경이 외부에서 자유롭게 이루어져 데이터 무결성 저하.
  • 비즈니스 로직과 데이터 구조가 뒤섞여 응집성이 낮아짐.

일급 컬렉션을 사용해야하는 이유는 무엇인가요? 😀

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

요약

일급 컬렉션은 컬렉션과 관련된 모든 로직을 하나의 객체로 캡슐화하여 응집성, 가독성, 재사용성을 높이고, 데이터 무결성을 보장합니다. 적절히 사용하면 유지보수가 쉬운 구조를 만들 수 있지만, 과도한 설계는 피해야 합니다.

추가 학습 자료

profile
🌱

0개의 댓글