본문 바로가기
2023-woowacourse-precourse

일급 컬렉션이요?? 그게 뭐죠?

by JHyun0302 2023. 11. 26.
728x90

객체지향 생활 체조 원칙 중 8번 원칙 "일급 컬렉션을 쓴다."

컬렉션은 알겠는데... 그래서 일급 컬렉션이 뭘까? 궁금증이 생겼다.

 

 


🧐 일급 컬렉션이란??

 

Collection을 Wrapping하면서, Wrapping한 Collection 외 다른 멤버 변수가 없는 상태를 일급 컬렉션이라 한다.

 

이게 무슨 말인가...?

 

public class ProductInfo {
    private final List<Product> products;
    private final int minPrice;

    private ProductInfo(List<Product> product) {
        this.products = Products.createProducts(product);
        this.minPrice = getMinPrice(products);
    }

    public static ProductInfo createProductInfo(List<Product> product) {
        return new ProductInfo(product);
    }

    ...
}

 

위 코드를 아래처럼 바꾼다!

 

public class ProductInfo {
    private final Products products; //바뀐 부분
    private final int minPrice;

    private ProductInfo(List<Product> product) {
        this.products = Products.createProducts(product);
        this.minPrice = getMinPrice(products);
    }

    public static ProductInfo createProductInfo(List<Product> product) {
        return new ProductInfo(product);
    }
    ....
}


public class Products { // 추가
    private final List<Product> products;

    private Products(List<Product> products) {
        this.products = products;
    }

    public static Products createProducts(List<Product> products) {
        return new Products(products);
    }
    ....
}

 

일급 컬렉션은 바로 "List Product"외 다른 멤버 변수가 없는 것!

 

 


💡 그래서 왜 필요한데?

 

개인적으로 아래 우아한기술블로그 예시가 아주 마음에 들었다!

 

요구사항 : GS 편의점, CU 편의점에 List<아이스크림>, List<과자>, List<라면> 등에 대한 validation이 필요하다!

 

일급 컬렉션이 없다면?

→ GS, CU 편의점 클래스에 공통 validation 내용을 작성해야만 한다!

중복 코드 발생

 

 

하지만 일급 컬렉션을 사용한다면?

→ List<아이스크림>, List<과자> 를 관리하는 일급 컬렉션 생성 & 공통 validation 내용을 작성

중복 코드 완화!

 

 


🤓 불변의 컬렉션?

 

불변의 중요성은 익히 알고 있을 것이다. 일급 컬렉션을 사용하면 불변으로 만들 수 있다!

 

 

public class Products {
    private final List<Product> products;

    private Products(List<Product> products) {
        this.products = products;
    }

    public static Products createProducts(List<Product> products) {
        return new Products(products);
    }
    
   public List<Product> getProducts() {
        return Collections.unmodifiableList(products); // 불변
    }
}

 

 

getter 사용시 "unmodifiableList"를 활용해보자!

그럼 products는 불변이 되고 아래처럼 사용해도 변경 불가능하다.

products.getProducts().add(new Product(...))

 

 

 

 

 

※ 참고 자료 

https://techblog.woowahan.com/2680/

 

코드리뷰 모음 서비스를 소개합니다. | 우아한형제들 기술블로그

{{item.name}} layout: post title: "코드리뷰 모음 서비스를 소개합니다." description: "코드리뷰 피드백 모음 서비스 javable" author: brown date: 2020-06-05 14:00:00 +0900 categories: techcourse published: true 안녕하세요. 교

techblog.woowahan.com

반응형