공부/자바

[자바] 일급 컬렉션(First Class Collection)

ghhong 2023. 1. 17. 13:54

출처 : https://tecoble.techcourse.co.kr/post/2020-05-08-First-Class-Collection

 

 

 

ㅇ일급 컬렉션(First Class Collection)

Collection wrapping하면서 Collection 다른 멤버변수가 없는 것을 의미한다.

 

Collection Wrapping한다는 것은 다음과 같다

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

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

 

출처: <https://tecoble.techcourse.co.kr/post/2020-05-08-First-Class-Collection/>

 

코드를 아래처럼 바꾼다.

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;
   
// ...
}

 

출처: <https://tecoble.techcourse.co.kr/post/2020-05-08-First-Class-Collection/>

 

사용하는 이유 :

GS편의점에 아이스크림을 파는데, 최대 10개까지만 있다고 하자.(검증)

// GSConvenienceStore.class
public class GSConvenienceStore {
   
private List<IceCream> iceCreams;
   
   
public GSConvenienceStore(List<IceCream> iceCreams) {
       
validateSize(iceCreams)
       
this.iceCreams = iceCreams;
   
}
   
   
private void validateSize(List<IceCream> iceCreams) {
            
if (iceCreams.size() >= 10) {
           
new throw IllegalArgumentException("아이스크림은 10개 이상의 종류를 팔지 않습니다.")
       
}
   
}
   
// ...
}

 

출처: <https://tecoble.techcourse.co.kr/post/2020-05-08-First-Class-Collection/>

 

이정도까지면 문제가 없다고 생각할 있는데, 만약 편의점에 아이스크림뿐만 아니라 다른 품목도 판매한다고 하면, 각각의 검증코드를 작성해냐하는 것이 문제다.

또한, 다른 편의점 클래스(CU) 생성된다 하면, 검증코드를 중복하여 사용하게 된다.

그리고 클래스에 특정 이름을 가진 아이스크림을 찾는 find코드가 추가된다하면, 각각의 클래스에 메서드를 추가해야할 것이다.

일급 컬렉션을 사용하면 상태와 행위를 각각 관리할 있다.

 

먼저 아이스크림 클래스에게 검증행위와 find행위를 시킨다.

// 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)
   
}
   
// ...
}

 

출처: <https://tecoble.techcourse.co.kr/post/2020-05-08-First-Class-Collection/>

 

 

편의점 클래스는 다음처럼 간단해진다.

// GSConvenienceStore.class
public class GSConvenienceStore {
   
private IceCreams iceCreams;
   
   
public GSConvenienceStore(IceCreams iceCreams) {
       
this.iceCreams = iceCreams;
   
}
   
   
public IceCream find(String name) {
       
return iceCreams.find(name);
   
}
   
// ...
}

// CUConvenienceStore.class
public class CUConvenienceStore {
   
private IceCreams iceCreams;
   
   
public CUConvenienceStore(IceCreams iceCreams) {
       
this.iceCreams = iceCreams;
   
}
   
   
public IceCream find(String name) {
       
return iceCreams.find(name);
   
}
   
// ...
}

 

출처: <https://tecoble.techcourse.co.kr/post/2020-05-08-First-Class-Collection/>

 

아이스크림 외에 추가 품목이 생겨도 클래스들에서 행위를 것이다.(상태와 로직을 관리할 것이다)

=> 일급 컬렉션을 사용하면 상태와 로직을 따로 관리할 있기 떄문에 로직이 사용되는 클래스의 부담을 줄일 있고, 중복코드를 줄일 있다.

 

추가 : 일급 컬렉션(first class collection) 컬렉션의 불변성을 보장할까?

일급컬렉션의 장점으로 컬렉션의 값을 변경할 있는 메서드가 없어서 불변성을 보장한다고 하는데, 컬렉션은 레퍼런스를 주고받기 때문에 여러 방법으로 변경시킬 있다.

예시)

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

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

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

public class LottoNumber {
   
private final int lottoNumber;

public LottoNumber(int lottoNumber) {
       
this.lottoNumber = lottoNumber;
   
}
   
   
// toString()은 로그를 찍기 위함이다.
   
@Override
   
public String toString() {
       
return "LottoNumber{" +
               
"lottoNumber=" + lottoNumber +
               
'}';
   
}
}

 

출처: <https://tecoble.techcourse.co.kr/post/2020-05-08-First-Class-Collection/>

 

위와 같은 코드(수정자 메서드,setter 없다.)에서 아래와 같은 테스트를 한다면

@Test
public void lotto_변화_테스트() {
   
List<LottoNumber> lottoNumbers = new ArrayList<>();
    lottoNumbers
.add(new LottoNumber(1));
   
Lotto lotto = new Lotto(lottoNumbers);
    lottoNumbers
.add(new LottoNumber(2));
}

 

출처: <https://tecoble.techcourse.co.kr/post/2020-05-08-First-Class-Collection/>

 

레퍼런스를 주고받기 때문에 영향이 있다.

이를 해결하기 위해 생성자에서 new 명령어를 추가하여 매번 새로운 객체를 만든다면?

 

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

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

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

 

출처: <https://tecoble.techcourse.co.kr/post/2020-05-08-First-Class-Collection/>

 

 

@Test
public void lotto_변화_테스트() {
   
List<LottoNumber> lottoNumbers = new ArrayList<>();
    lottoNumbers
.add(new LottoNumber(1));
   
Lotto lotto = new Lotto(lottoNumbers);
    lotto
.getLotto().add(new LottoNumber(2));
}

 

출처: <https://tecoble.techcourse.co.kr/post/2020-05-08-First-Class-Collection/>

 

그래도 get 메서드를 사용할 레퍼런스를 전달받아서 수정이 가능하다.

해결방법을 위해 포스트에서 잠깐 사용한 unmodifiable Collection 사용해야 한다.

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);
   
}
}

 

출처: <https://tecoble.techcourse.co.kr/post/2020-05-08-First-Class-Collection/>

 

Return 객체가 unmodifiable이므로 변경이 불가능하다.

 

일급 컬렉션을 사용하는 이유

일급 컬렉션이란? 본 글은 일급 컬렉션 (First Class Collection)의 소개와 써야할 이유를 참고 했다. 일급 컬렉션이란 단어는 소트웍스 앤솔로지의 객체지향 생활체조 규칙 8. 일급 콜렉션 사용에서 언

tecoble.techcourse.co.kr

 

일급 컬렉션을 사용하는 이유

일급 컬렉션이란? 본 글은 일급 컬렉션 (First Class Collection)의 소개와 써야할 이유를 참고 했다. 일급 컬렉션이란 단어는 소트웍스 앤솔로지의 객체지향 생활체조 규칙 8. 일급 콜렉션 사용에서 언

tecoble.techcourse.co.kr

 

일급 컬렉션을 사용하는 이유

일급 컬렉션이란? 본 글은 일급 컬렉션 (First Class Collection)의 소개와 써야할 이유를 참고 했다. 일급 컬렉션이란 단어는 소트웍스 앤솔로지의 객체지향 생활체조 규칙 8. 일급 콜렉션 사용에서 언

tecoble.techcourse.co.kr

 

일급 컬렉션을 사용하는 이유

일급 컬렉션이란? 본 글은 일급 컬렉션 (First Class Collection)의 소개와 써야할 이유를 참고 했다. 일급 컬렉션이란 단어는 소트웍스 앤솔로지의 객체지향 생활체조 규칙 8. 일급 콜렉션 사용에서 언

tecoble.techcourse.co.kr

 

일급 컬렉션을 사용하는 이유

일급 컬렉션이란? 본 글은 일급 컬렉션 (First Class Collection)의 소개와 써야할 이유를 참고 했다. 일급 컬렉션이란 단어는 소트웍스 앤솔로지의 객체지향 생활체조 규칙 8. 일급 콜렉션 사용에서 언

tecoble.techcourse.co.kr

 

일급 컬렉션을 사용하는 이유

일급 컬렉션이란? 본 글은 일급 컬렉션 (First Class Collection)의 소개와 써야할 이유를 참고 했다. 일급 컬렉션이란 단어는 소트웍스 앤솔로지의 객체지향 생활체조 규칙 8. 일급 콜렉션 사용에서 언

tecoble.techcourse.co.kr

 

일급 컬렉션을 사용하는 이유

일급 컬렉션이란? 본 글은 일급 컬렉션 (First Class Collection)의 소개와 써야할 이유를 참고 했다. 일급 컬렉션이란 단어는 소트웍스 앤솔로지의 객체지향 생활체조 규칙 8. 일급 콜렉션 사용에서 언

tecoble.techcourse.co.kr

 

일급 컬렉션을 사용하는 이유

일급 컬렉션이란? 본 글은 일급 컬렉션 (First Class Collection)의 소개와 써야할 이유를 참고 했다. 일급 컬렉션이란 단어는 소트웍스 앤솔로지의 객체지향 생활체조 규칙 8. 일급 콜렉션 사용에서 언

tecoble.techcourse.co.kr

 

일급 컬렉션을 사용하는 이유

일급 컬렉션이란? 본 글은 일급 컬렉션 (First Class Collection)의 소개와 써야할 이유를 참고 했다. 일급 컬렉션이란 단어는 소트웍스 앤솔로지의 객체지향 생활체조 규칙 8. 일급 콜렉션 사용에서 언

tecoble.techcourse.co.kr

 

일급 컬렉션을 사용하는 이유

일급 컬렉션이란? 본 글은 일급 컬렉션 (First Class Collection)의 소개와 써야할 이유를 참고 했다. 일급 컬렉션이란 단어는 소트웍스 앤솔로지의 객체지향 생활체조 규칙 8. 일급 콜렉션 사용에서 언

tecoble.techcourse.co.kr

 

일급 컬렉션을 사용하는 이유

일급 컬렉션이란? 본 글은 일급 컬렉션 (First Class Collection)의 소개와 써야할 이유를 참고 했다. 일급 컬렉션이란 단어는 소트웍스 앤솔로지의 객체지향 생활체조 규칙 8. 일급 콜렉션 사용에서 언

tecoble.techcourse.co.kr

 

일급 컬렉션을 사용하는 이유

일급 컬렉션이란? 본 글은 일급 컬렉션 (First Class Collection)의 소개와 써야할 이유를 참고 했다. 일급 컬렉션이란 단어는 소트웍스 앤솔로지의 객체지향 생활체조 규칙 8. 일급 콜렉션 사용에서 언

tecoble.techcourse.co.kr

 

일급 컬렉션을 사용하는 이유

일급 컬렉션이란? 본 글은 일급 컬렉션 (First Class Collection)의 소개와 써야할 이유를 참고 했다. 일급 컬렉션이란 단어는 소트웍스 앤솔로지의 객체지향 생활체조 규칙 8. 일급 콜렉션 사용에서 언

tecoble.techcourse.co.kr

 

일급 컬렉션을 사용하는 이유

일급 컬렉션이란? 본 글은 일급 컬렉션 (First Class Collection)의 소개와 써야할 이유를 참고 했다. 일급 컬렉션이란 단어는 소트웍스 앤솔로지의 객체지향 생활체조 규칙 8. 일급 콜렉션 사용에서 언

tecoble.techcourse.co.kr

 

일급 컬렉션을 사용하는 이유

일급 컬렉션이란? 본 글은 일급 컬렉션 (First Class Collection)의 소개와 써야할 이유를 참고 했다. 일급 컬렉션이란 단어는 소트웍스 앤솔로지의 객체지향 생활체조 규칙 8. 일급 콜렉션 사용에서 언

tecoble.techcourse.co.kr

 

일급 컬렉션을 사용하는 이유

일급 컬렉션이란? 본 글은 일급 컬렉션 (First Class Collection)의 소개와 써야할 이유를 참고 했다. 일급 컬렉션이란 단어는 소트웍스 앤솔로지의 객체지향 생활체조 규칙 8. 일급 콜렉션 사용에서 언

tecoble.techcourse.co.kr