“멤버 변수로 컬렉션이 있고, 이외의 다른 멤버 변수는 없는 클래스“를 일급 컬렉션이라고 한다. 이런 일급 컬렉션이 객체지향 프로그램에 왜 사용되는지 정리해본다.
예시:
public class LottoTicket {
private static final int LOTTO_NUMBERS_SIZE = 6;
private static List<Long> lottoNumbers;
public LottoTicket(List<Long> lottoNumbers) {
validate(lottoNumbers);
this.lottoNumbers = new ArrayList<>(lottoNumbers);
}
...
}
비즈니스에 종속적인 자료구조
일급 컬렉션 내에서 비즈니스 로직을 처리할 수 있어, 관리하기가 쉬워진다. 위의 예시의 경우 LottoTicket
이 생성될 때, 생성자내에서 검증 로직(validate()
)이 존재하기 때문에, 컬렉션을 생성할 때마다 검증을 해야될지 고민할 필요가 없어진다.
불변성 보장
Java의 컬렉션에서 final
키워드를 사용하면, 컬렉션의 값을 수정이 금지되는 것이 아니라 컬렉셔의 주소값 수정 즉 재할당이 금지된다. 따라서 컬렉션에 불변성을 보장하는 것에는 한계가 있다. 하지만 일급 컬렉션의 컬렉션을 private final
로 선언하고, 컬렉션의 값을 수정하는 인스턴스 메서드를 만들지 않는다면 이 컬렉션의 불변성을 보장할 수 있게된다.
이 때, 당연히 생성자에서는 방어적 복사를 해야된다. 참고
단일책임의 원칙(SRP: Single Responsibility Principle)
어떤 도메인을 컬렉션으로 만들면서 새로운 책임이 발생할 수 있다. 이 책임은 위에서 설명한 새로운 검증 로직이 필요할 수도 있고, 이 컬렉션에 대한 여러가지 비즈니스 로직을 다루어야할 수 있다. 만약 컬렉션이 존재하는 클래스외에 다른 필드도 함께 존재한다면, 이는 클래스의 입장에서는 너무 많은 책임을 가지게 되며 단일책임의 원칙을 위배하게된다. 일급 컬렉션으로 이 문제를 해결할 수 있다.
관련 사이트
https://jojoldu.tistory.com/412
https://velog.io/@lsb156/객체지향-개발-5대-원칙-SOLID
https://woowacourse.github.io/javable/post/2020-05-08-First-Class-Collection/
댓글남기기