개요
객체지향적 프로그래밍, 클린코드를 공부하면서 계속 해서 등장하는 단어가 있는데요, 바로 일급 컬렉션 입니다.
그동안 저는 단순히 객체의 책임 분리에 집중하며 프로그래밍을 이어왔는데요, 일급 컬렉션의 개념이야 말로 객체지향적 프로그래밍에 한 발자국 나아가는 개념이라는 사실을 깨달았습니다.
이번 포스팅에서는 우아한 프리코스 숫자 야구 게임 을 바탕으로 일급 컬렉션을 어떻게 사용하고 왜 이를 도입해야 하는지 알아보도록 하겠습니다.
1. 일급 컬렉션이란
일급 컬렉션은 컬렉션을 다루는 하나의 패턴인데요, 컬렉션을 감싸는 단일 클래스를 만들고 해당 클래스를 통해 컬렉션과 관련된 모든 로직을 처리하는 것입니다.
컬렉션을,, 감싸는,, 단일 클래스?
쉽게 숫자 야구 예제를 통해 설명해보겠습니다!
public class Player {
private List<Integer> numbers;
public Player() {
}
public Player(List<Integer> numbers) {
this.numbers = numbers;
}
public void setNumbers(List<Integer> newNumbers) {
PlayerValidator.validate(newNumbers);
numbers = newNumbers;
}
...
Java
복사
제 코드 중 일부인데요, 저는 numbers 라는 컬렉션(리스트)에 숫자를 저장하고자 하였습니다!
List<Interger> numbers를 일급 컬렉션으로 변환 하려면 어떻게 해야할까요?
public class Numbers {
private List<Integer> numbers;
public Numbers(List<Integer> numbers) {
this.numbers = numbers;
}
}
Java
복사
바로 클래스 안에 컬렉션 하나만 멤버 변수로 가지면 됩니다.
위 경우에는 List<Interger> numbers 하나만을 멤버 변수로 가지고 있는 Numbers 일급 컬렉션이 만들어졌습니다!
오,, 그래서 일급 컬렉션을 왜 써야되는데?
2. 일급 컬렉션의 장점
우선 위 Numbers 클래스를 조금 더 구체화 해보겠습니다.
package baseball.domain;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Numbers {
private final List<Integer> numbers;
public Numbers(List<Integer> numbers) {
PlayerValidator.validate(numbers);
this.numbers = new ArrayList<>(numbers);
}
public List<Integer> getNumbers() {
return Collections.unmodifiableList(numbers);
}
public int getNumber(int index) {
return numbers.get(index);
}
public int calculateStrikeCount(Numbers other) {
int strikeCount = 0;
for (int i = 0; i < numbers.size(); i++) {
if (numbers.get(i).equals(other.getNumber(i))) {
strikeCount++;
}
}
return strikeCount;
}
public int calculateBallCount(Numbers other) {
int ballCount = 0;
for (int i = 0; i < numbers.size(); i++) {
for (int j = 0; j < numbers.size(); j++) {
if (i != j && numbers.get(i).equals(other.getNumber(j))) {
ballCount++;
}
}
}
return ballCount;
}
}
Java
복사
여기서 확인할 수 있는 일급 컬렉션의 특징은 다음과 같습니다.
1.
불변성 : 일급 컬렉션은 컬렉션의 불변성을 보장한다. 즉, 한번 생성되면 그 내용은 변경할 수 없다.
2.
비즈니스 로직 : 모든 컬렉션 관련 비즈니스 로직을 일급 컬렉션 클래스 내부에서 처리한다.
3.
간접 노출 : 컬렉션을 반환 할 때는 그 원본을 반환 하는 것이 아닌 컬렉션의 복사 본을 만들어 반환한다.
이를 통해 우리는 안정성을 획득할 수 있고, 모든 로직이 클래스 내부에 집중되었으므로 캡슐화를 강화 할 수 있습니다.
사실 위 장점들은 크게 와 닿지 않을 수 있습니다..!
제가 일급 컬렉션을 사용하면서 무엇보다 좋았던건 바로 코드를 짜기 훨씬 수월 하다는 점이었습니다. 일급 컬렉션과 관련있는 모든 비즈니스 로직은 일급 컬렉션에 구현하면 되니깐요!