일급 컬렉션이란?
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를 새로 재할당하여 저장하는 것이다. 재할당을 하지 않고 주소 값만 사용할 경우 전달받은 리스트에 수정을 가하면 불변을 보장할 수 없기 때문이다.
참고자료
'개발 > JAVA' 카테고리의 다른 글
JDK 21의 새로운 개념 JEP 431: Sequenced Collections (0) | 2023.03.21 |
---|---|
[JCF] ArrayList와 LinkedList의 차이 (0) | 2023.02.17 |
[JAVA] Enum 이란? (0) | 2022.11.10 |
[우아한 테크코스 프리코스] 테스트 코드 분석(AssertJ, JUnit5) (0) | 2022.11.09 |
[JAVA] Lambda Expressions 람다식이란? (0) | 2022.11.08 |