일급 컬렉션이란?

Collection을 Wrapping하면서, Wrapping한 Collection 외 다른 멤버 변수가 없는 상태를 일급 컬렉션이라 한다.

 

다음의 예를 살펴보자.

List<Integer> lotto = new ArrayList<>();
lotto.add(1);
lotto.add(2);
lotto.add(3);
lotto.add(4);
lotto.add(5);
lotto.add(6);

로또번호 6자리를 임의로 뽑는 간단한 코드를 작성했다. 여기서 Collection을 Wrapping 해보자.

public class Lotto {
    private final List<Integer> numbers;

    public Lotto(List<Integer> numbers) {
        this.numbers = numbers;
    }
}

이것이 일급 컬렉션이다. 일급 컬렉션을 왜 써야할까?

로또 번호를 뽑는 코드에 숫자를 검증하는 로직이 추가된다고 가정해보자.

public class Lotto {
    private final List<Integer> numbers;

    public Lotto(List<Integer> numbers) {
    	validate(numbers);
        this.numbers = numbers;
    }

    private void validate(List<Integer> numbers) {
        // 꺼내서 1~45인지 확인한다.
    }
}

일급 컬렉션 내에서 검증에 대한 로직을 수행하기 때문에 다른 추가 코드가 발생하더라도 Lotto를 사용하는 코드에서 수정되는 코드는 없을 것 이다. 즉, 중복을 줄여주고 로직이 사용되는 클래스를 가볍게 해준다.

 

또한, 컬렉션의 불변을 보장한다.

final List<Integer> lotto = new ArrayList<>();
lotto.add(1);
lotto.add(2);
lotto.add(3);
lotto.add(4);
lotto.add(5);
lotto.add(6);

final 키워드는 단순히 재할당만 금지할 뿐 위와 같은 코드는 정상적으로 동작할 것이다. 즉, 불변을 보장할 수 없다.

불변을 보장할 수 없게 되면 소프트웨어의 크기가 커질수록 코드를 이해하고 수정하는데 어려워질 수 있다.

일급 컬렉션의 불변을 보장하기 위해서는 위에서 작성했던 Lotto 클래스에 수정해야 할 것이 있다.

public class Lotto {
    private final List<Integer> numbers;

    public Lotto(List<Integer> numbers) {
        this.numbers = new ArrayList<>(numbers);
    }
}

생성자 부분에서 List를 새로 재할당하여 저장하는 것이다. 재할당을 하지 않고 주소 값만 사용할 경우 전달받은 리스트에 수정을 가하면 불변을 보장할 수 없기 때문이다.

 

참고자료

+ Recent posts