
우아한테크코스 프리코스를 진행하면서 객체의 모음에 대한 처리가 필요한 경우가 많았다.
예를 들어 Orders라는 클래스가 List을 멤버 변수로 가지고, Order의 개수에 대한 예외 처리가 필요한 부분이다.
이런 고민들을 하면서 일급 컬렉션이 있다는 것을 알고, 재밌어서 동아리에서 발표도 했었다.
블로그를 통해서 공유하면 좋을 것 같아서 이 주제를 정했다.
일급 컬렉션이란 뭘까?
일급 컬렉션은 소트웍스 앤솔로지의 객체지향 생활체조 규칙 8. 일급 콜렉션 사용에서 언급되었다.
컬렉션에 대한 처리를 하면서, 컬렉션 외 다른 멤버 변수가 없는 상태를 일급 컬렉션이라고 한다.
위의 예처럼, Orders 클래스에서 List만 멤버 변수로 가지고, 그에 대한 처리를 하는 클래스를 일급 컬렉션이라고 한다.
그렇다면 일급 컬렉션의 장점이 뭐길래 사용하는 것일까?
일급 컬렉션의 장점은 다음과 같다.
음... 이해가 잘 안갈 것 같은데 하나하나 알아가 보자!
비즈니스? 비즈니스 로직이 뭘까?
우선 서비스 로직에 대해서 알아보자
서비스 로직이란 특정 기능이나 업무를 수행하는 코드 집합이다.
예를 들어, 택배 배송 서비스, 사용자 등록 서비스가 있다.
그렇다면, 비즈니스 로직이란 뭘까?
비즈니스 로직은 사용자의 요구사항을 해결하기 위한 실질적인 코드이다.
예를 들어, 배달료 계산, 배송 상태, 도착 시간 계산, 주소 검증 등이 있다.
아래는 일급 컬렉션을 사용하지 않고 StudentGroup 컬렉션을 사용한 경우이다.

이 경우에 무슨 문제점이 있을까? StudentGroup을 다른 곳에서 사용할 경우 검증 로직 코드를 중복해서 작성해야 한다.
또한 다른 사람이 코드를 읽을 때, 코드의 이해가 어려울 수 있다.
다음은 일급 컬렉션을 사용했을 경우이다.

StudentGroup이라는 일급 컬렉션을 만들고, 멤버 변수로 List를 두었다.
이렇게 하면, 검증 로직이 필요하다는 것을 쉽게 알 수 있고, 중복도 줄이며, 유지 보수가 편해진다.
꼭 불변성을 보장해야할 필요는 없지만 일반적으로 이렇게 사용함을 알리고 시작한다.
일급 컬렉션을 사용하면 컬렉션의 불변성을 보장한다.
근데 불변성을 보장하면 좋은 점이 뭘까?
일급 컬렉션은 내부 상태가 변경되지 않기 때문에 다른 부분에서 예상치 못한 변경을 걱정할 필요가 없다.
이로 인해 프로그램의 안정성과 예측 가능성을 높일 수 있다.
일급컬렉션을 만들 때, 불변성을 지키는 방법에 대해서 알아보자.

일반적으로 일급 컬렉션은 위와 같이 만든다. 하지만 이렇게 하면 문제점이 2가지 있다.

첫번째 문제점은 다음과 같다. 생성자에서 this.students = students로 할 경우 주소 값이 같기 때문에 일급 컬렉션 클래스 밖에서 students의 값이 변경될 경우 StudentGroup 내부의 값도 변경된다.

두번째 문제점은 다음과 같다. 일급 컬렉션의 getter에서 return students로 할 경우. getter에서 반환된 students의 값을 밖에서 변경하면 StudentGroup의 값도 변경된다.
이 두 문제를 해결하는 방법은 다음과 같다.

생성자에서 새로운 리스트를 만들어서 넣고, getter에서도 수정 불가능한 상태로 리턴한다.
일급 컬렉션의 장점 중 하나는 상태와 행위를 한 곳에서 관리한다는 것이다.

위의 코드를 보면 상태와 행위의 코드가 분리된 것을 볼 수 있다.
상태와 행위를 모아놓지 않으면 메서드를 중복해서 사용하거나, 연관성을 이해하지 못할 수 있다.

이렇게 상태와 행위을 모아놓으면 특정 메서드를 사용할 때, 특정 방식을 강제할 수 있다는 장점도 있다.
개발자마다 다른 변수명을 사용하기 때문에 컬렉션을 그냥 사용하면 검색과 관리가 힘들 수 있다.
예를 들어, 1번 개발자는 List에 대해서 Cars라고 할 수도 있고, CarRegistry라고 할 수 도 있다.
일급 컬렉션을 사용하여 컬렉션에 이름을 지정하면, 데이터의 목적과 종류를 명확히 전달하여 가독성을 높일 수 있다.
또한, 팀원들간에 표현을 동일하게 할 수 있다.

위와 같이 컬렉션을 그냥 사용하면, physicsStudents, physicsGroupStudents 등 이름이 다양하게 나오지만,
일급 컬렉션을 사용하면 PhysicsGroup이라고 통일할 수 있다.
일급 컬렉션은 컬렉션 하나외에 멤벼 변수가 없는 클래스이고, 비즈니스에 종속적인 자료구조, 컬렉션의 불변성 보장, 상태와 행위를 한 곳에서 관리, 이름을 가지는 컬렉션 등의 장점을 가진다.
https://jojoldu.tistory.com/412
https://tecoble.techcourse.co.kr/post/2020-05-08-First-Class-Collection/