일급 컬렉션을 간단하게 설명하면 Collection을 Wrapping하면서 그 외의 다른 멤버 변수가 없는 상태를 일급 컬렉션이라고 한다.
원시값 포장과 유사하다. 원시값을 포장하던것을 Collection을 포장하면 된다.
public class Users {
private List<Integer> values;
public Users(List<Integer> values) {
this.values = values;
}
}
위 코드가 일급 컬렉션이다.
일급 컬렉션을 사용함으로써 다음과 같은 이점을 가지게 됩니다.
- 비지니스에 종속적인 자료구조 ( )
- Collection의 불변성을 보장
- 상태와 행위를 한 곳에서 관리
- 이름이 있는 컬렉션
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 들이 어떻게 사용되는지 검색 시 변수명으로만 검색할 수 있습니다
- 이 상황에서 검색은 거의 불가능합니다.
- 개발자마다 다르게 지을 수 있기 때문입니다.
- 명확한 표현이 불가능
- 변수명에 불과하기 때문에 의미를 부여하기가 어렵습니다
- 이는 개발팀/운영팀간에 의사소통시 보편적인 언어로 사용하기가 어려움을 얘기합니다.
- 중요한 값임에도 이를 표현할 명확한 단어가 없는것이죠.
UserValues userValues = new UserValues;
ManagerValues managerValues = new ManagerValues;
AdminValues adminValues = new AdminValues;
컬렉션을 변수로 작성하기 보다는 아래 코드로 클래스 타입을 명시해줌으로써 비지니스적 의미를 표현할 수 있게 된다. 추가로, 컬렉션 클래스를 검색하면 모든 사용 코드를 찾아낼 수 있다.
개발팀/운영팀 내에서 사용될 표현은 이제 이 컬렉션에 맞추면 된다.
'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 |
댓글