기타

First Class Collection

창욱씨 2025. 6. 13. 23:23
반응형

First Class Collection이란

First Class Collection이란 Collection을 Wrapping 하면서 Collection 외에 다른 멤버 변수가 없는 클래스를 의미합니다.

class Members {
    private List<Member> members;

    public Members(List<Member> members) {
        this.members = members;
    }
}

First Class Collection을 사용하는 이유

비즈니스 종속적인 코드 작성

예를 들어 한 스터디당 스터디원의 최대 인원은 10명이라는 조건이 추가되었다고 가정합니다. 우선 First Class Collection을 적용하지 않은 코드는 아래와 같습니다.

public class Study {

    private String name;
    private boolean isFree;
    private List<Member> members;

    public Study(String name, boolean isFree, List<Member> members) {
        validate(members);
        this.name = name;
        this.isFree = isFree;
        this.members = members;
    }

    private void validate(List<Member> members) {
        if (members.size() > 10) {
            throw new IllegalArgumentException("멤버는 최대 10명입니다.");
        }
    }
}

코드를 보면 Study 클래스가 member collection에 대한 검증까지 맡게 됩니다. 만약 위와 같은 형태로 member collection을 사용하는 다른 클래스가 생긴다면 그곳에서도 동일한 검증 로직을 추가해 주어야 하는 번거로움이 생깁니다.

하지만 First Class Collection을 사용하면 검증 로직에 대해 걱정하지 않아도 되고 중복 코드도 줄일 수 있습니다.

public class Study {

    private String name;
    private boolean isFree;
    private Members members;

    //더이상 Members 검증에 대한 걱정을 외부에서 하지 않아도 된다.
    public Study(String name, boolean isFree, Members members) {
        this.name = name;
        this.isFree = isFree;
        this.members = members;
    }
}

//일급 컬렉션
class Members {
    private List<Member> members;

    public Members(List<Member> members) {
        validate(members);
        this.members = members;
    }

    private void validate(List<Member> members) {
        if (members.size() > 10) {
            throw new IllegalArgumentException("스터디원은 최대 10명입니다.");
        }
    }
}

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

비즈니스 종속적인 코드의 첫 번째 예시를 보면 Study 클래스는 member에 대해 검증을 하는 역할을 포함하고 있습니다. 두 번째 예시처럼 First Class Collection을 적용하면 MemberList에 대한 상태와 행위를 캡슐화 함으로써 Study 클래스에서 member에 대한 책임을 덜어낼 수 있습니다.

Collection을 불변으로 만들 수 있습니다.

Java에서 일반적으로 final 키워드를 활용해 변수를 불변으로 만들 수 있습니다. 하지만 final 키워드는 변수에 대한 재할당만을 막아주기 때문에 Collection에 데이터를 추가하거나 제거하는 것을 막을 수 없습니다. First Class Collection을 활용해 외부에서 Collection에 직접 접근하는 것을 막고 메서드를 통해서만 Collection의 값을 읽을 수 있게 만들면 Collection을 불변으로 만들 수 있습니다.

참고: https://developer-hm.tistory.com/227

반응형