일급 컬렉션

2023. 10. 31. 14:54JAVA

우아한 테크코스 1주차 코드리뷰에서, 일부 지원자분들이 Numbers 클래스를 만들어 기능을 구현하는 것을 보았습니다. 해당 클래스 내부에 검증과 판정과 같은 관련 메서드를 작성한 것을 확인했습니다. 이러한 구조는 코드를 이해하기 쉽고 올바른 객체지향 코드라고 생각되어, 2주차 목표 중 하나로 이러한 형식을 준수해보기로 했습니다. 

 

최근 커뮤니티를 통해 이러한 구조가 일급 컬렉션임을 알게 되었습니다. 일급 컬렉션과 관련한 여러 글들을 읽어보며 알게된 내용들을 정리해보고자 합니다.

 

참고한 글은 다음과 같습니다!

 

https://tecoble.techcourse.co.kr/post/2020-05-08-First-Class-Collection/

 

일급 컬렉션을 사용하는 이유

일급 컬렉션이란? 본 글은 일급 컬렉션 (First Class Collection)의 소개와 써야할 이유를 참고 했다. 일급 컬렉션이란 단어는 소트웍스 앤솔로지의 객체지향 생활체조 규칙 8. 일급 콜렉션 사용에서 언

tecoble.techcourse.co.kr

 

 

일급 컬렉션


 

일급 컬렉션이란 "Collection을 Wrapping하면서, Wrapping한 Collection 외 다른 멤버 변수가 없는 상태"를 의미합니다.

 

 

이러한 wrapping을 통해 가지는 장점으로는 총 4가지가 있다.

 

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

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

+ Collection의 불변성을 보장

+ 이름이 있는 컬렉션


(불변성과 이름의 경우는 그렇게 중요하지 않다고 판단해 번호 대신 +로 표현했습니다.)

 

 

 

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

 

자료구조가 비지니스에 종속적이지 않는다면 문제가 발생할 가능성이 있다. 예를 들어 검증 로직이 필요한 객체가 있다고 가정할때, 검증 로직을 따로 구현해 놓았다고 하자. 이후에 검증 로직의 필요성을 모르는 사람이 코드를 작성하게 된다면 이를 빼먹고 작성할 여지가 있다. 즉 모든 코드와 도메인을 알고 있지 않는 다면 문제가 생길 수 있다. 따라서 해당 검증 로직을 거쳐서만 생성할 수 있는 자료구조를 만들어 버리면 된다. 이를 위해 Wrapping을 사용하게 되었고 이러한 자료구조를 일급 컬렉션이라고 한다.

 

 

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

 

일급 컬렉션은 값과 로직이 함께 존재한다는 장점을 가지고 있다. 만일 이러한 과정이 없다면 컬렉션과 관련이 있는 로직이라도, 관련성을 표현할 수 없다. 즉 관련 없는 다른 객체를 가져와 로직을 진행하는 불상사가 생길 수도 있다는 문제가 존재한다. 무엇보다 코드의 가독성과 유지보수에 긍정적인 영향을 미친다는 것이 장점이라고 할 수 있다.

 

 

+ Collection의 불변성을 보장

 

Java의 final은 재할당만을 금지한다는 특성을 가지고 있다. 즉 final은 불변성을 보장하지는 않는다. 따라서 wrapping하고 컬렉션의 값을 변경할 수 있는 메소드를 만들지 않는다면? 이는 불변성을 보장하는 컬렉션이라고 할 수 있다. 하지만 완전한 불변성이라고는 말할 수없다. 만일getter로 받은 collection의 element에 변화를 줄 수 있다. 따라서 getter에 collections.unmodifiableList를 부여함으로 불변성을 지킬 수 있다.

 

그럼에도 일급 컬렉션에는 getter의 이용을 지양한다. 값이 일급 컬렉션의 외부에서 수정이 일어나는 일을 방지할 수 있다.

 

 

+ 이름이 있는 컬렉션

 

컬렉션에 이름을 붙일 수 있다는 것 또한 큰 장점이라고 할 수 있다. 같은 구조를 가지더라도 다른 기능을 하는 경우 이름을 명시함으로 구분이 가능해진다. 이러한 구분이 없다면 변수명으로 검색을 하기에 불편함이 있으며, 중요도를 명확히 표현하기 어렵다는 문제점을 가지고 있습니다.