그룹스터디

일급 컬렉션(First Class Collection)

민초닷컴 2022. 12. 23. 17:35

일급 컬렉션

Collection을 Wrapping하면서, 그 외 다른 멤버 변수가 없는 상태

 

아래의 코드를

Map<String, String> map = new HashMap<>();
map.put("1", "A");
map.put("2", "B");
map.put("3", "C");

아래와 같이 Wrapping 하는 것

public class GameRanking {

    private Map<String, String> ranks;

    public GameRanking(Map<String, String> ranks) {
        this.ranks = ranks;
    }
}

 

일급 컬렉션의 이점

  • 비즈니스에 종속적인 자료구조
  • Collection의 불변성을 보장
  • 상태와 행위를 한 곳에서 관리
  • 이름이 있는 컬렉션2

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

위 코드의 문제점

  • 검증 로직이 필요한 데이터 구분
  • 모든 코드와 도메인을 알고 있지 않다면 문제 발생의 가능성 

2. 불변

컬렉션의 값을 변경할 수 있는 메소드가 없는 컬렉션을 만들면 불변 컬렉션

불변성 관련 이슈

  • 보통 일급컬렉션을 구현할 때 Collections.unmodifiableList를 활용한다.
  • 하지만 Collection에 담겨 있는 Item의 속성은 변경이 가능
  • Collections.unmodifiableList(new ArrayList<>(값))
  • 값.stream().map(값의 item::Clone).collect(toList()) → 깊은 복사
  • https://soft.plusblog.co.kr/71 → unmodifialbeList 추가설명 </aside>

3. 상태와 행위를 한 곳에서 관리

public class PayGroups {
    private List<Pay> pays;

    public PayGroups(List<Pay> pays) {
        this.pays = pays;
    }

    public Long getNaverPaySum() {
        return pays.stream()
                .filter(pay -> PayType.isNaverPay(pay.getPayType()))
                .mapToLong(Pay::getAmount)
                .sum();
    }
}

4. 이름이 있는 컬렉션

이름이 있는 컬렉션의 장점

  • 검색 용이
  • 명확한 표현 가능(용어 사용) 

참고문헌 : https://jojoldu.tistory.com/412?fbclid=IwAR2o1vtCxGXKaz5F_HETqF04lOdNn1H2zOyxoUppYzCmAcoag8RiQxPqeRk