백엔드 멘토링

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

piedra_de_flor 2023. 7. 10. 22:58

Car-racing 미션을 진행하면서 일급 컬렉션이라는 것에 대해 공부해보았고, 사용해보았다.

 

일급 컬렉션이란?

Java에서 일급 컬렉션(First-Class Collection)은 다른 객체와 동등한 지위를 갖는 컬렉션 객체를 말합니다.
일급 컬렉션은 다음과 같은 특징을 가집니다.

  • 컬렉션 객체는 변수나 매개변수에 할당할 수 있다.
  • 컬렉션 객체는 다른 객체와 동등한 지위를 가진다.
  • 컬렉션 객체는 반환값으로 사용할 수 있다.
  • 컬렉션 객체는 필요한 경우 메서드에서 생성할 수 있다.

그냥 간단하게 한 문장으로 말하면 Collection을 Wrapping 하면서, 그 외 다른 멤버 변수가 없는 상태 일급 컬렉션이라 합니다.

 

 

예를 들어보자면

public class Cars {
    private final List<Car> cars;

    public Cars(List<Car> cars, String[] carNames) {
        makeCarListWithNames(cars, carNames);
        this.cars = cars;
    }

    private void makeCarListWithNames(List<Car> cars, String[] carNames) {
        for (String carName : carNames) {
            cars.add(makeCar(carName));
        }
    }

    private Car makeCar(String name) {
        return new Car(name);
    }

    public List<Car> getCars() {
        return Collections.unmodifiableList(cars);
    }
}

이렇게 Collection의 값을 하나의 Wrapping하여 클래스로 관리 해주는 것입니다.

일급 컬렉션에서는 setter 메서드를 선언해서는 안됩니다.

 

 public Game(Conditions conditions, Input input) {
        this.cars = new Cars(new ArrayList<>(), input.getCarNames());
        this.condition = conditions;
    }

    public List<Car> getCars() {
        return cars.getCars();
    }

위의 코드처럼 호출하여 사용이 가능하게 되는 것입니다.

 

 

장점

  • 가독성과 유지보수성이 향상된다.
  • 유효성 검증이 용이해진다.

일급 컬렉션을 사용한다면 이런 장점들을 가질 수 있습니다. 

많은 글에서 setter를 사용하지 않기에 불변성을 보장한다라는 장점은 사실 일급 컬렉션으로는 구현이 불가능 합니다.

setter 메서드가 없어도 Collection은 충분히 변경이 가능하기 때문에 불변을 구현하고 싶다면

Collections.unmodifiableList(cars)

Collections.unmodifiableList() 를 사용하여야 합니다.

 

 

일급 컬렉션은 궁극적으로 Collection을 비지니스 로직에 종속된 하나의 자료구조로 만들기 위해 사용한다 라고 볼 수 있습니다.