[Java] 일급 컬렉션(First Class Collection)이란?
본문 바로가기
Java

[Java] 일급 컬렉션(First Class Collection)이란?

by IYK2h 2022. 11. 22.
728x90

일급 컬렉션을 간단하게 설명하면 Collection Wrapping하면서 그 외의 다른 멤버 변수가 없는 상태를 일급 컬렉션이라고 한다.

원시값 포장과 유사하다. 원시값을 포장하던것을 Collection을 포장하면 된다.

public class Users {
    private List<Integer> values;

      public Users(List<Integer> values) {
        this.values = values;
    }
}

위 코드가 일급 컬렉션이다.

일급 컬렉션을 사용함으로써 다음과 같은 이점을 가지게 됩니다.

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

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

원시값 포장에서도 나온 개념으로 객체 자체로 검증로직을 처리할 수 있게된다.

예시로 1부터 9까지 서로 다른 수로 이루어진 3자리의 수만 입력받을 수 있다고 가정하자. ex)123(O), 112(X), 012(O)

public class Users {
    private List<Integer> values;

    public Users(List<Integer> values) {
        CheckLength(values);
        CheckRange(values);
        CheckDuplicate(values);
        this.values = values;
    }

    public List<Integer> getValues() {
        return this.values;
    }

    private void CheckRange(List<Integer> values) {
        for (Integer i : values) {
            if (i == 0) throw new IllegalArgumentException("입력값은 1부터9까지 입력할 수 있습니다.");
        }
    }

    private void CheckLength(List<Integer> values) {
        if (values.size() != 3) throw new IllegalArgumentException("입력값은 3개 값만 입력할 수 있습니다.");
    }

    private void CheckDuplicate(List<Integer> values) {
        for (int i = 0; i < values.size() - 1; i += 1) {
            if (values.get(i) == values.get(i + 1)) throw new IllegalArgumentException("입력값은 중복될 수 없습니다.");
        }
    }
}

이렇게 작성함으로써 1부터 9까지 서로 다른 수로 이루어진 3자리의 수만 입력받을 수 있게 된다.

이제 입력값이 필요한 모든 로직은 이 일급 컬렉션만 있으면 된다.

이렇게 비즈니스에 종속적인 자료구조가 만들어져, 이후 발생할 문제가 최소화되었다.

2. Collection의 불변성을 보장

Java에서는 final로 그 문제를 해결할 수 없으므로 일급 컬렉션 (Frist Class Collection)과 래퍼 클래스 (Wrapper Class) 등의 방법으로 해결해야만 한다.

그래서 아래와 같이 컬렉션의 값을 변경할 수 있는 메소드가 없는 컬렉션을 만들면 불변 컬렉션이 된다.

public class Users {
    private List<Integer> values;

      public Users(List<Integer> values) {
        this.values = values;
    }
      public List<Integer> getValue() {
            return this.values;
}

이 클래스는 생성자와 getValue() 이외에 다른 메소드가 없다. 즉, 값을 새로 만들거나, 가져오는 것만 가능하게 된다.

List 컬렉션에 접근할 방법이 없으므로 갑을 추가/변경이 안 된다.

이렇게 불변 컬렉션을 만들 수 있다.

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

값과 로직이 함께 존재한다는 것이다. (이 부분은 Enum의 장점과도 같다)

일급 컬렉션은 값과 로직이 함께 존재하여 외부에서의 중복된 메서드의 생성과 같은 문제를 해결해줍니다.

예시로 user, manager, admin의 values의 각 자릿수마다 더한 값을 출력한다고 가정하면, 3개의 중복된 여러 메서드를 생성해야 한다.

이러한 문제는 일급 컬렉션을 생성하고 해당 메서드들을 일급 컬렉션 내에 만들어두고 외부에서 호출하여 사용하도록 하게 되면 상태와 행위를 한 곳에서 관리할 수 있게 된다.

4. 이름이 있는 컬렉션

List<Integer> userValues;
List<Integer> managerValues;
List<Integer> adminValues;

위 코드의 단점은 뭘까요?

  • 검색이 어려움
    • Values 들이 어떻게 사용되는지 검색 시 변수명으로만 검색할 수 있습니다
    • 이 상황에서 검색은 거의 불가능합니다.
    • 개발자마다 다르게 지을 수 있기 때문입니다.
  • 명확한 표현이 불가능
    • 변수명에 불과하기 때문에 의미를 부여하기가 어렵습니다
    • 이는 개발팀/운영팀간에 의사소통시 보편적인 언어로 사용하기가 어려움을 얘기합니다.
    • 중요한 값임에도 이를 표현할 명확한 단어가 없는것이죠.

https://jojoldu.tistory.com/412

 

UserValues userValues = new UserValues;
ManagerValues managerValues = new ManagerValues;
AdminValues adminValues = new AdminValues;

컬렉션을 변수로 작성하기 보다는 아래 코드로 클래스 타입을 명시해줌으로써 비지니스적 의미를 표현할 수 있게 된다. 추가로, 컬렉션 클래스를 검색하면 모든 사용 코드를 찾아낼 수 있다.

개발팀/운영팀 내에서 사용될 표현은 이제 이 컬렉션에 맞추면 된다.

728x90

'Java' 카테고리의 다른 글

[Java] @ParameterizedTest 이름 설정, 인텔리제이 오류  (0) 2022.11.24
[Jvav] Map.getOrDefault  (0) 2022.11.24
[Java]Wrapper Class  (0) 2022.11.11
[Java] 원시값 포장  (0) 2022.11.08
[Java] List, ArrayList 차이  (0) 2022.08.30

댓글