[클린코드] 일급 컬렉션
우테코 1주차 과제를 리팩토링하면서 일급 컬렉션이라는 개념에 대해서 알게 됐다. 오늘은 일급 컬렉션이 무엇인지, 그리고 언제 사용하면 유용한지에 대해서 소개하겠다.
일급 컬렉션이란 무엇일까?
규칙 8: 일급 콜렉션 사용
콜렉션을 포함한 클래스는 반드시 다른 멤버 변수가 없어야 한다.
각 콜렉션은 그 자체로 포장돼 있으므로 이제 콜렉션과 관련된 동작은 근거지가 마련된셈이다.
필터가 이 새 클래스의 일부가 됨을 알 수 있다.
필터는 또한 스스로 함수 객체가 될 수 있다.
또한 새 클래스는 두 그룹을 같이 묶는다든가 그룹의 각 원소에 규칙을 적용하는 등의 동작을 처리할 수 있다.
이는 인스턴스 변수에 대한 규칙의 확실한 확장이지만 그 자체를 위해서도 중요하다.
콜렉션은 실로 매우 유용한 원시 타입이다.
많은 동작이 있지만 후임 프로그래머나 유지보수 담당자에 의미적 의도나 단초는 거의 없다. - 소트웍스 앤솔로지 객체지향 생활체조편
이 내용은 객체지향 생활체조
에서 소개된 내용이다. 개념 자체는 단순하다. 컬렉션을 클래스로 감싸고 다른 맴버 변수가 없도록 하면 이 클래스가 일급 컬렉션이 된다.
컬렉션을 감싸면서 얻는 이점은 다음과 같다.
- 비지니스에 종속적인 자료구조가 된다.
- 컬렉션의 불변성을 보장한다.
- 상태와 행위를 한 곳에서 관리할 수 있다.
- 컬렉션에 이름을 부여할 수 있다.
이제 각각을 하나씩 설명해보겠다.
비지니스에 종속적인 자료구조
아래와 같은 요구사항이 있다고 해보자.
- 3자리의 수
- 각 수는 중복되면 X
이런 자료구조는 기본으로 제공하지 않는다. 이를 일반적인 자료구조로 구현하기 위해서는 이 요구사항을 만족시키는 값을 생성하는 모든 코드에 검증 로직을 추가해야 한다. 그리고 만약 신입이 처음 회사에 들어와서 코드를 작성하면 검증이 필요한 로직인지 알 수 있는 방법이 없다.
즉 모든 코드와 도메인을 알아야 제대로 코드를 작성할 수 있다.
이런 검증 로직과 데이터를 묶는 비지니스에 종속적인 자료구조가 바로 일급 컬렉션
이다. 아래 코드를 보자
public class ComputerNumber {
private final List<Integer> number;
public ComputerNumber() {
this.number = new ArrayList<>();
createComputerNumber(number);
}
private void createComputerNumber(List<Integer> number) {
while (number.size() < 3) {
int randomNumber = Randoms.pickNumberInRange(1, 9);
if (!number.contains(randomNumber)) {
number.add(randomNumber);
}
}
}
public int get(int index) {
return number.get(index);
}
public boolean contains(int value) {
if (number.contains(value)) {
return true;
} else {
return false;
}
}
}
숫자를 저장하는 List를 ComputerNumber
라는 클래스로 감싸서 일급 컬렉션으로 만든 코드이다. ComputerNumber
라는 일급 컬렉션을 사용하게 되면 앞으로 길이가 3, 중복이 없는 숫자를 생성할 때 이 객체를 사용하면 된다. 비지니스에 종속적인 자료구조를 직접 만든 것이다.
불변
일급 컬렉션은 불변을 보장한다. 이는 final
과는 차이가 있다.
java의 final
은 불변이 아니라 재할당만 금지한다. 아래 코드를 보자
class FinalTest {
@Test
public void final_test() {
final Set<String> set = new HashSet<>();
set.add("1");
set.add("2");
set.add("3");
Assertions.assertEquals(set.size(), 3);
}
}
이 코드를 실행하면 set에 값이 추가된다.
이와같이 자바의 final은 불변이 아니라 단순 재할당만 막는 기능을 한다.
최근의 소프트웨어의 규모가 계속 커짐에 따라 불변
은 굉장히 중요한 키워드가 됐다.
이를 java의 final
로는 해결할 수 없는데 일급 컬렉션
을 사용하면 불변 컬렉션을 만들 수 있다
위의 ComputerNumber
클래스는 처음 생성자에서 숫자를 생성하고 그 이후 변경할 수 있는 setter가 없기 때문에 불변
을 보장한다.
이렇게 일급 컬렉션을 이용하면 불변 컬렉션을 만들 수 있다.
상태와 행위를 함께 관리
일급 컬렉션은 값과 로직을 함께 관리한다. 일급 컬렉션을 사용하지 않으면 데이터와 로직이 떨어져 있기 때문에 관리상의 어려움이 있다.
이는 유지보수 측면에서 좋지 못하다. 전체 도메인을 알지 못하면 해당 로직이 구현되어 있는지 알 수 없어서 똑같은 로직을 구현하는 문제가 발생할 수 있다.
이름이 있는 컬렉션
일급 컬렉션을 사용하면 컬렉션에 이름을 붙일 수 있다.(클래스이기 때문에 가능) 이렇게 되면 검색도 편리하고 표현도 가능하게 된다.
@Test
public void 이름있는_컬렉션() {
List<Item> newyorkItems = createNewyorkItems();
List<Item> seoulItems = createSeoulItems();
}
이 코드는 오직 변수명으로만 검색해야 하고, 개발자마다 뜻을 다르게 사용할 여지가 있다. 따라서 명확한 표현이 불가능하다.
아래 코드를 보자
@Test
public void 일급컬렉션() {
SeoulItems seoulItems = new SeoulItems(createSeoulItems());
BusanItems busanItems = new BusanItems(createBusanItems());
}
위 코드같은 경우 일급 컬렉션을 기반으로 검색이 가능하다. 클래스 단위로 관리되기 때문에 검색이 쉽다.
이처럼 일급 컬렉션은 다양한 장점을 가지고 있고 유지보수 측면에서 굉장히 좋다. 필수적으로 공부하자!
참고 사이트
-
https://jojoldu.tistory.com/412
-
https://jamie95.tistory.com/99
-
https://jamie95.tistory.com/entry/%EC%9D%BC%EA%B8%89-%EC%BB%AC%EB%A0%89%EC%85%98%EC%9D%84-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90
-
https://matouslescotousles.tistory.com/11