[JAVA] 코드가 달라지기 가장 쉬운 방식: 일급 컬렉션이란 무엇일까?

조시현·2023년 11월 3일
0

클린코드

목록 보기
2/4
post-thumbnail

개요

최근 클린 코드와 유지보수가 편한 코드를 고민하며 지내다 보니 일급컬렉션 이라는 개념을 자주 접하게 되었습니다.
그러나 일급 컬렉션이라는 개념에 대한 정보가 없었고 이를 적용해 보고싶다는 생각이 들었습니다.

이 글에서는 일급 컬렉션(Fisrt Class Collection)이 무엇인지, 왜 사용해야 하는지, 그리고 이를 통해 어떤 장점이 있는지 자세히 살펴보겠습니다.
( + 어려운 단어는 우측 타임라인을 통해 넘어가면 편하다)

일급 컬렉션이란?

컬렉션을 제외한 다른 멤버 변수를 가지지 않는 컬렉션을 wrapping하는 클래스입니다.

일급 컬렉션은 소트웍스 앤솔로지의 객체지향 생활체조 파트에서 언급이 된 단어로 객체 지향 프로그래밍에서 컬렉션을 일반 데이터 유형과 동일하게 처리할 수 있음을 의미합니다.

즉, 다른 변수와 마찬가지로 컬렉션을 생성, 전달, 반환 및 할당할 수 있으며 컬렉션 자체를 다른 컬렉션에 배치하거나 매개 변수로 전달할 수 있습니다.

일급 컬렉션의 규칙

규칙 8: 일급 컬렉션 사용

이 규칙의 적용은 간단하다.
컬렉션을 포함한 클래스는 반드시 다른 멤버 변수가 없어야 한다.
각 컬렉션은 그 자체로 포장돼 있으므로 이제 컬렉션과 관련된 동작은 근거지가 마련된셈이다.

필터가 이 새 클래스의 일부가 됨을 알 수 있다.
필터는 또한 스스로 함수 객체가 될 수 있다.
또한 새 클래스는 두 그룹을 같이 묶는다든가 그룹의 각 원소에 규칙을 적용하는 등의 동작을 처리할 수 있다.
이는 인스턴스 변수에 대한 규칙의 확실한 확장이지만 그 자체를 위해서도 중요하다.

컬렉션은 실로 매우 유용한 원시 타입이다.
그렇지만 많은 동작이 있지만 후임 프로그래머나 유지보수 담당자에 개발자가 특정 기능이나 로직을 왜 작성했는지, 또는 어떤 목적을 위해 작성했는지에 대한 힌트는 거의 없다.
하지만 일급 컬렉션을 사용하면 이를 해결 할 수 있다.

위는 소트웍스 앤솔로지의 객체지향 생활체조 파트에서 언급부분을 가져오고
어려운 단어나 문장을 이해가 쉽게 각색한 부분이다.

일급 컬렉션 생성법

일급 컬렉션은 다음과 같은 방식을 적용하여 생성 할 수 있습니다.

  • 컬렉션을 감싸는 전용 클래스 생성
    특정 컬렉션을 위한 전용 클래스를 만듭니다.

  • 불변성 보장
    일반적으로 불변 객체로 설계하여 컬렉션의 상태 변경을 제한합니다.

  • 비즈니스 로직 캡슐화
    컬렉션과 관련된 모든 비즈니스 로직을 이 클래스 내부에 구현합니다.

  • 의미 있는 이름 부여
    컬렉션의 목적이나 의미를 명확히 표현하는 이름을 클래스에 부여합니다.

  • 상태와 행위 통합 관리
    컬렉션의 상태와 이와 관련된 모든 동작을 한 클래스에서 관리합니다

개념만으로는 쉽게 이해가 되지 않는데
왜 이러한 방식을 써야하는지에 대한 장점을 들으면 생각이 달라지실겁니다.

일급 컬렉션의 장점

  • 캡슐화
    컬렉션과 관련된 데이터 및 동작을 하나의 클래스로 그룹화하여 캡슐화함으로써 코드를 더 깔끔하고 이해하기 쉽게 만들 수 있습니다.

  • 비지니스에 종속적인 객체 생성 가능
    비지니스에 종속적인 자료구조가 만들어져 잘 알지 못하는 자료구조로 발생할 오류를 제어할 수 있다.

  • 가독성 향상
    컬렉션에 의미 있는 이름을 지정하면 의도를 명확하게 전달하고 코드 가독성을 높일 수 있습니다.

  • 유지 관리 용이
    컬렉션과 관련된 모든 작업이 하나의 클래스에 집중되어 있어 유지 관리가 더 쉽고 오류 가능성이 줄어듭니다.

  • 불변성 보장
    컬렉션을 불변 개체로 만들어 데이터 무결성을 보호하고 의도하지 않은 변경을 방지할 수 있습니다.

  • 재사용성 향상
    일급 컬렉션 클래스를 다른 코드에서 재사용하여 코드 중복을 줄이고 개발 효율성을 높일 수 있습니다.

일급 컬렉션 예시

  • 옷장 관리
    옷의 종류와 이름이 포함된 지도를 이용하여 옷장을 관리하는 클래스를 생성할 수 있습니다. 이 클래스는 옷 추가, 제거, 검색과 같은 기능을 제공할 수 있습니다.
public class Closet {
    private final Map<String, String> clothes;

    public Closet(Map<String, String> clothes) {
        this.clothes = new HashMap<>(clothes);
    }

    public String getCloth(String type) {
        return clothes.get(type);
    }

    public Collection<String> allClothes() {
        return Collections.unmodifiableCollection(clothes.values());
    }

    public void addCloth(String type, String cloth) {
        clothes.put(type, cloth);
    }

    public void removeCloth(String type) {
        clothes.remove(type);
    }
}
  • 장바구니 관리
    제품 ID와 수량을 포함하는 지도를 사용하여 장바구니를 관리하는 클래스를 생성할 수 있습니다. 이 클래스는 제품 추가, 제거, 주문과 같은 기능을 제공할 수 있습니다.
public class ShoppingCart {
    private final Map<String, Integer> cart;

    public ShoppingCart(Map<String, Integer> cart) {
        this.cart = new HashMap<>(cart);
    }

    public int getQuantity(String productId) {
        return cart.getOrDefault(productId, 0);
    }

    public void addProduct(String productId, int quantity) {
        cart.put(productId, cart.getOrDefault(productId, 0) + quantity);
    }

    public void removeProduct(String productId) {
        cart.remove(productId);
    }

    public Collection<Integer> allProducts() {
        return Collections.unmodifiableCollection(cart.values());
    }
}

결론

일급 컬렉션은 깔끔하고 유지 관리 가능한 코드를 만드는 데 유용한 도구입니다.
컬렉션과 관련된 데이터 및 동작을 캡슐화함으로써 코드 가독성을 높이고, 유지 관리를 더 쉽게 만들 수 있고 더 안전하게 컬렉션을 관리할 수 있으므로 달라진 코드를 위해서 꼭 사용해보시기를 추천드립니다!


출처

https://velog.io/@seongwon97/%EC%9D%BC%EA%B8%-89-%EC%BB%AC%EB%A0%89%EC%85%98%EC%9D%B4%EB%9E%80

https://jojoldu.tistory.com/412

https://jinseong-dev.tistory.com/36

단어 정리

필터

주로 컬렉션의 요소들을 특정 기준에 따라 선택하거나 변환하는 작업을 의미

ex) Steam.filter()

profile
소프트웨어 관련 고민을 좋아하고 상황에 맞는 답을 함께 찾아가는 과정을 좋아합니다. 😀

0개의 댓글