1. 일급 컬렉션(First-Class Collection)이 무엇인가요?
일급 컬렉션(First-Class Collection)은 컬렉션 객체를 포장(wrap)하면서, 그 외 다른 멤버 변수가 없는 상태를 말한다. 즉, 컬렉션을 감싸고 있는 클래스로, 해당 클래스는 오직 하나의 컬렉션 필드만 가진다. 일급 컬렉션을 사용하면 컬렉션과 관련된 비즈니스 로직을 한 곳에서 관리할 수 있게 되고, 불변성을 보장하며, 비즈니스에 특화된 명확한 이름을 부여할 수 있어 검색이나 가독성을 높일 수 있다.
1 - 1. 예시
아래와 같은 코드가 있다고 가정해보면,
List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");
아래와 같이 일급 컬렉션으로 만들 수 있다.
public class Names {
private final List<String> names;
public Names(List<String> names) {
this.names = new ArrayList<>(names);
}
// 필요한 메서드들...
}
2. 일급 컬렉션을 사용해야 하는 이유는 무엇인가요?
2 - 1. 비즈니스 로직이 일급 컬렉션으로 응집된다.
일급 컬렉션을 사용하면 해당 컬렉션과 관련된 비즈니스 로직을 한 곳에서 관리할 수 있다.
예를 들어, 로또 번호를 관리하는 일급 컬렉션을 만들어 본다면,
public class LottoNumbers {
private final List<Integer> numbers;
public LottoNumbers(List<Integer> numbers) {
validate(numbers);
this.numbers = numbers;
}
private void validate(List<Integer> numbers) {
if (numbers.size() != 6) {
throw new IllegalArgumentException("로또 번호는 6개여야 합니다.");
}
if (new HashSet<>(numbers).size() != 6) {
throw new IllegalArgumentException("로또 번호는 중복될 수 없습니다.");
}
// 추가적인 검증 로직...
}
}
이렇게 하면 로또 번호와 관련된 모든 규칙과 로직을 한 곳에서 관리할 수 있다.
만약 LottoNumber라는 일급 컬렉션을 만들지 않았다면, LottoService에서 검증 로직을 수행해야 만 한다.
로또 번호가 필요한 모든 장소에서 검증 로직이 들어가야 할텐데,
검증 로직을 Service에서 처리하지 않고, 일급 컬렉션에 책임을 위임하는 것이다.
2 - 2. 불변성 보장
일급 컬렉션은 컬렉션의 불변성을 쉽게 보장할 수 있다.
불변성을 보장하는 것은 대단히 중요하다.
객체가 변경 되지 않음을 보장한다면, 코드를 이해하기 쉽고, 수정하는 것에도 사이드 이펙트가 줄어들게 되기 때문이다.
생성자에서 새로운 컬렉션을 만들고, setter 를 제공하지 않음으로써 불변성을 유지할 수 있다.
핵심은 일급 컬렉션은 새로 만들거나 값을 가져오는 것일 뿐,
값을 변경하거나 추가하지 못하도록 해야 한다.
public class ImmutableNames {
private final List<String> names;
public ImmutableNames(List<String> names) {
this.names = new ArrayList<>(names);
}
public List<String> getNames() {
return Collections.unmodifiableList(names);
}
}
2 - 3. 상태와 행위를 한 곳에서 처리
일급 컬렉션을 사용하면 컬렉션과 관련된 동작을 해당 클래스 내에서 정의할 수 있다.
이는 응집도를 높이고 관련 로직을 한 곳에서 관리할 수 있게 해준다.
public class Team {
private final List<Member> members;
// 생성자...
public boolean isFull() {
return members.size() >= 5;
}
public void addMember(Member member) {
if (isFull()) {
throw new IllegalStateException("팀이 이미 가득 찼습니다.");
}
members.add(member);
}
}
2 - 4. 이름이 있는 컬렉션
일급 컬렉션을 사용하면 컬렉션에 의미 있는 이름을 부여할 수 있다.
이는 코드의 가독성을 높이고 의도를 명확하게 전달할 수 있게 해준다.
public class WinningNumbers extends LottoNumbers {
// 당첨 번호에 특화된 메서드들...
}
public class PlayerNumbers extends LottoNumbers {
// 플레이어 번호에 특화된 메서드들...
}
3. 결론
일급 컬렉션은 객체지향 프로그래밍에서 강력한 도구이다. 이를 통해 비즈니스 로직을 캡슐화하고, 불변성을 보장하며, 코드의 가독성과 유지보수성을 높일 수 있다. 일급 컬렉션을 적절히 활용하면 더 깔끔하고 견고한 코드를 작성할 수 있다.
4. References
https://www.maeil-mail.kr/question/53
https://jojoldu.tistory.com/412
https://hudi.blog/thoughtworks-anthology-object-calisthenics/
'백엔드 면접 질문' 카테고리의 다른 글
트랜잭션 격리수준은 무엇인가요? (0) | 2024.12.03 |
---|---|
데이터베이스 인덱스에 대해서 설명해주세요. (0) | 2024.12.02 |
자바에서 Checked Exception과 Unchecked Exception에 대해서 설명해주세요. (0) | 2024.11.28 |
JPA의 N + 1 문제에 대해서 설명해주세요 (1) | 2024.11.27 |
Entity Manager에 대해 설명해주세요. (0) | 2024.11.26 |