[ 일급콜렉션 : First Class Collection ]

Collection 을 Wrapping 한 클래스

규칙 8: 일급 콜렉션 사용
이 규칙의 적용은 간단하다.
콜렉션을 포함한 클래스는 반드시 다른 멤버 변수가 없어야 한다.
각 콜렉션은 그 자체로 포장돼 있으므로 이제 콜렉션과 관련된 동작은 근거지가 마련된셈이다.
필터가 이 새 클래스의 일부가 됨을 알 수 있다.
필터는 또한 스스로 함수 객체가 될 수 있다.
또한 새 클래스는 두 그룹을 같이 묶는다든가 그룹의 각 원소에 규칙을 적용하는 등의 동작을 처리할 수 있다.
이는 인스턴스 변수에 대한 규칙의 확실한 확장이지만 그 자체를 위해서도 중요하다.
콜렉션은 실로 매우 유용한 원시 타입이다.
많은 동작이 있지만 후임 프로그래머나 유지보수 담당자에 의미적 의도나 단초는 거의 없다. - 소트웍스 앤솔로지 객체지향 생활체조편

[ 일급콜렉션의 예 ]

// 콜렉션 사용
final List<Integer> lottoTicket = new ArrayList<>();
lottoTicket.add(4);
lottoTicket.add(11);
lottoTicket.add(15);
lottoTicket.add(21);
lottoTicket.add(33);
lottoTicket.add(45);
// 일급콜렉션 (Wrapping)
public class LottoTicket {
	
    private final List<Integer> lottoNumbers;
    
    public LottoTicket(List<Integer> lottoNumbers){
    	this.lottoNumbers = lottoNumbers;
    }
}

 

[ 일급콜렉션을 왜 써야 하는가? ]

1. 비지니스에 종속적인 자료구조 : Wrapper 클래스(일급콜렉션 클래스) 내에서 콜렉션에 대한 유효성 검사 및 정제 등의 로직을 포함하여 비지니스에 필요한 자료구조를 만들 수 있다. (ex: LottoTicket 내에서 Lotto 번호 범위(1~45)에 대한 유효성 검사 로직을 추가)

2. 불변 : 콜렉션 변수를 final 로 선언시 재할당만 불가할 뿐, 콜렉션에 .set 등이 가능하여 불변성 보장이 되지 않는 반면 일급콜렉션 사용시 선언 후엔 조작이 불가.

3. 상태와 행위를 한 곳에서 관리 : 값과 로직이 함께 존재 (ex: 일급콜렉션 클래스 내에 콜렉션의 합계를 구하는 메소드를 구현하여 상태와 행위를 한 곳에서 관리)

4. 이름이 있는 컬렉션 : Wrapping 한 클래스를 사용하므로 인스턴스 생성시 new ArrayList<>() 대신 new LottoTicket(createNonDuplicatedNumbers()) 이 가능.

 

 

* 일급콜렉션에서 Wrapping 한 인스턴스 변수를 외부에서 필요로 할 땐?

Collections.unmidifiableList 를 사용하여 리턴하여 외부에서의 변경을 막는다.

 

출처 및 참고 : 

https://jojoldu.tistory.com/412

 

https://velog.io/@injoon2019/%EC%9D%BC%EA%B8%89%EC%BB%AC%EB%A0%89%EC%85%98%EC%9D%98-%EB%B6%88%EB%B3%80%EA%B0%9D%EC%B2%B4-unmodifiable-%EB%B0%A9%EC%96%B4%EC%A0%81-%EB%B3%B5%EC%82%AC

반응형

'back' 카테고리의 다른 글

[TDD] 테스트주도개발  (0) 2022.10.04
JWT  (0) 2020.11.18
[gradle] jar build, war build  (0) 2020.03.25

+ Recent posts