1. 일급 컬렉션이란?
소트웍스 앤솔러지의 9가지 객체지향 생활체조 중 8번째 규칙으로 처음 언급된 단어이다.
규칙 8: 일급 컬렉션 사용
이 규칙의 적용은 간단하다.
컬렉션을 포함한 클래스는 반드시 다른 멤버 변수가 없어야 한다.
각 콜렉션은 그 자체로 포장돼 있으므로 이제 컬렉션과 관련된 동작은 근거지가 마련된 셈이다.
필터가 이 새 클래스의 일부가 됨을 알 수 있다.
필터는 또한 스스로 함수 객체가 될 수 있다.
또한 새 클래스는 두 그룹을 같이 묶는다든가 그룹의 각 원소에 규칙을 적용하는 등의 동작을 처리할 수 있다.
이는 인스턴스 변수에 대한 규칙의 확실한 확장이지만 그 자체를 위해서도 중요하다.
컬렉션은 실로 매우 유용한 원시 타입이다.
많은 동작이 있지만 후임 프로그래머나 유지보수 담당자에 의미적 의도나 단초는 거의 없다.
즉, Collection을 Wrapping 하고, 그 외의 다른 멤버 변수가 없어야 한다.
예를 들어, 아래와 같은 collection을
List<User> users = new ArrayList<>();
for (String userName : getuserNames) {
users.add(new User(userName));
}
아래와 같이 wrapping 하는 것이다.
public class Users {
private List<User> users; // 멤버 변수
public Users(List<User> users) {
this.users = users;
}
}
2. 일급 컬렉션의 특징
- 비즈니스에 종속적인 자료구조
- Collection의 불변성을 보장
- 상태와 행위를 한 곳에서 관리
- 이름이 있는 컬렉션
이 네 가지 특징들에 대한 설명은 굉장히 많은 블로그들에 굉장히 자세히 설명되어 있다. 따라서 여기서는 내가 과제를 진행하면서 체감한 특징들에 대해 간단히 서술하고 지나가려 한다.
비지니스에 종속적인 자료구조
가장 대표적인 예시가 값에 대한 검증 메서드이다. 만약 게임에 참가하는 유저에 대해 다음과 같은 제한 조건이 있다고 하자.
- 유저의 이름은 1~5자 이내이다.
- 유저의 이름에는 영어와 한글 이외의 특수문자가 올 수 없다.
이러한 상황에서 일급 컬렉션을 적용하지 않고 코드를 작성한다면, 유저를 사용하는 모든 로직에서는 우선적으로 검증 단계가 필요할 것이다.
유저를 만들고 곧바로 검증로직을 거친 후 사용한다 해도 방대한 양의 코드에서 어떤 문자열이 유저에 해당하는 입력값이고, 다른 사람이 코드를 봤을 때 어떤 방식으로 이 검증로직이 실행되는지 파악하기는 어려울 것이다.
이러한 상황에서 원하는 조건으로만 생성할 수 있는 새로운 자료구조를 만들 수 있다면 어떨까?
public class Users {
private final List<User> users;
public Users(List<String> userNames) {
validateUserFormat(userNames);
this.users = userNames;
}
}
일급컬렉션을 사용하면 다음과 같이 입력값에 대한 조건 검증 후 객체를 생성할 수 있다.
Collection의 불변성을 보장
복잡한 소프트웨어를 구성할 때 불변 객체는 아주 강력한 이점을 가진다. 어떠한 객체의 정보가 절대 바뀔 수 없다는 것이 보장되면 그만큼 해당 객체를 사용할 로직을 구성할 때 위험성이 낮아지기 때문이다.
final을 사용하는 경우도 있지만 엄밀히 말하면 final은 불변성을 보장하지 않고, 값의 재할당만 금지하는 기능을 가진다.
일급 컬렉션을 통해 Wrapping 하면 해당 객체의 접근은 컬렉션 내에 정의된 함수로만 가능하기 때문에 setter 기능을 하는 메서드를 생성하지 않는 한 컬렉션의 불변성을 보장하게 된다.
개인 학습을 위해 작성되는 글입니다.
올바르지 않은 개념에 대한 지적 또는 추가적인 질문사항은 언제든지 댓글 달아주세요..!
참조 링크: 일급 컬렉션 (First Class Collection)의 소개와 써야 할 이유 - https://jojoldu.tistory.com/412
일급 컬렉션을 사용하는 이유 - https://tecoble.techcourse.co.kr/post/2020-05-08-First-Class-Collection/
'Programing Language > Java' 카테고리의 다른 글
[JAVA] 제네릭(Generic) (2) | 2023.03.14 |
---|