일급 콜렉션 (First Class Collection) 지향하기

이진호·2022년 10월 12일
0
post-thumbnail

규칙 8: 일급 콜랙션 사용

콜렉션을 포함한 클래스는 반드시 다른 멤버 변수가 없어야 한다. 각 콜렉션은 그 자체로 포장돼 있어야 하며 콜렉션과 관련된 동작은 해당 영역에서 관리되어야 한다.

Collection Wrapping

public class Person {
    private String name;
    private List<Car> cars;
    // ...
}

public class Car {
    private String name;
    private String oil;
    // ...
}

위와 같은 코드를 아래와 같이 매핑

public class Person {
    private String name;
    private Cars cars;
    // ...
}

// List<Car> cars를 Wrapping
// 일급 컬렉션
public class Cars {
    // 멤버변수가 하나 밖에 없다!!
    private List<Car> cars;
    // ...
}

public class Car {
    private String name;
    private String oil;
    // ...
}

일급 컬렉션 Cars는 List<Car> cars 외 다른 멤버 변수를 가지고 있지 않다.

일급 컬렉션의 장점

비즈니스에 종속적인 자료구조

// IceCream.class
public class IceCreams {
    private List<IceCream> iceCreams;
    
    public IceCreams(List<IceCream> iceCreams) {
        validateSize(iceCreams)
        this.iceCreams = iceCreams
    }
    
    private void validateSize(List<IceCream> iceCreams) {
    	if (iceCreams.size() >= 10) {
            new throw IllegalArgumentException("아이스크림은 10개 이상의 종류를 팔지않습니다.")
        }
    }
    
    public IceCream find(String name) {
        return iceCreams.stream()
            .filter(iceCream::isSameName)
            .findFirst()
            .orElseThrow(RuntimeException::new)
    }
    // ...
}

위 예시와 같이 비즈니스 로직(validateSize, find)을 해당 클래스에서 관리하는 비즈니스 종속적 자료구조를 생성할 수 있으며, 상태와 행위를 한곳에서 관리할 수 있습니다.

컬렉션의 불변을 보장하게 할 수 있음.

컬랙션 객체는 final 키워드로 선언하더라도 재할당만 금지되며 불변이 보장되지는 않습니다. 하지만 아래와 같이 일급 콜랙션을 사용하면 해당 객체의 불변을 보장하게 할 수 있습니다.

public class Lotto {
    private final List<LottoNumber> lotto;

    public Lotto(List<LottoNumber> lotto) {
        this.lotto = new ArrayList<>(lotto);
    }

    public List<LottoNumber> getLotto() {
        return Collections.unmodifiableList(lotto);
    }
}

단, 일급 컬랙션이 반드시 불변인 것은 아니며, 단지 불변 컬랙션을 만드는 용이한 방법중 하나일 뿐입니다.

출처

0개의 댓글