Java에서 일급 컬렉션이란 컬렉션을 단순히 List, Set, Map같은 자료구조로만 사용하는 대신 컬렉션 자체를 클래스로 감싸는 것을 의미한다. 예시를 들면 다음과 같다.
public class Name{
private final List<String> names;
public Name(List<String> names){
validate(names);
this.name = names;
}
private void validate(List<String> names){
if (names.isEmpty()){
throw new IllegalArgumentException("빈 값은 입력할 수 없습니다.")
}
}
public int size(){
return names.size()
}
public List<String> getNames(){
return Collections.unmodifiableList(names); //외부에서 수정 못하게 불변리스트 리턴
}
}
Name이라는 클래스로 묶었기 때문에 비록 리스트형이더라도 외부에서 쉽게 접근할 수 없어 캡슐화가 용이하다. 다음의 장점 때문에 일급컬렉션을 쓴다.
데이터 캡슐화: 컬렉션을 별도의 클래스로 캡슐화해 외부에서 직접 컬렉션에 접근할 수 없도록 보호한다.
불변성 유지: 컬렉션을 일급 컬렉션으로 만들면 불변성을 쉽게 보장할 수 있다. 생성자에서 컬렉션을 초기화하고 이후 변경하지 않도록 설계해 데이터를 안전하게 유지할 수 있다. 예를 들면 getValues()메서드를 설계할 때는 unmodifiableList처럼 불변하게 리턴하는 설계를 할 수 있다.
컬렉션 관련 비즈니스 로직 집중화: 일급 컬렉션 클래스 내에 컬렉션과 관련된 로직을 함께 정의함으로써 코드의 응집도를 높인다. 이 방식은 비즈니스 로직을 해당 컬렉션을 사용하는 곳마다 구현하지 않고, 컬렉션 클래스에 포함시켜 코드 중복을 줄일 수 있습니다.
자체 검증 로직: 일급 컬렉션 클래스 안에서 요소 추가, 삭제 시 필요한 자체 검증 로직을 정의할 수 있다. 예를 들어 Names라는 List가 비어있으면 에러를 발생시키는 로직을 컬렉션 내에 정의할 수 있다.