새로운 내용을 공부할 때
새로운 내용의 공부를 시작할 때 용어의 정의를 이해하지 못하거나 정확하게 알지 못한다면 그 용어가 포함된 문장을 이해하지 못합니다.
작은 단어 하나가 내용을 이해하지 못하게 하기 때문에 용어를 정확하게 이해하는 것이 중요합니다.
일급 컬렉션과 응집도는 언제 씀
목표 D-day : 37 일
일급 컬렉션
컬렉션 → List, Set, Map
first-class citizen
프로그래맹 언어 설계에서, 일급 시민은 다른 엔티티에서 일반적으로 사용할 수 있는 모든 연산을 지원하는 엔티티를 말합니다.
- 변수로 할당될 수 있다.
- 파라미터로 전달될 수 있다.
- 함수의 결과로 반환될 수 있다.
엔티티란?
영어로 개체라는 의미며, 프로그래밍 언어에서 값이나, 객체, 함수와 같이 다룰 수 있는 개별적인 요소들을 말합니다.
예를 들어, 자바에서 클래스가 일급 시민입니다.
// 1. 클래스의 객체를 변수로 할당
Person person = new Person("둘리");
// 2. 클래스의 객체를 메서드의 파라미터로 전달
greetPerson(person);
// 3. 클래스의 객체를 메서드의 반환값으로 사용
Person returnedPerson = createPerson("둘리");
System.out.println("Returned Person: " + returnedPerson.getName())
클래스는 변수에 할당할 수 있고, 메서드의 파라미터로 전달할 수 있으며 메서드의 반환 값으로 사용할 수 있습니다.
하지만 자바에서 메서드는 일급 객체가 아닙니다. 변수에 할당할 수 없고, 메서드의 파라미터로 전달할 수 없으며, 반환 값으로도 사용하지 못하기 때문입니다.
정의
-
컬렉션을 포장하여 유일한 필드로 가지는 객체를 말합니다.
-
컬렉션을 추상화하여 의미를 부여하고, 컬렉션과 관련된 로직을 포함할 수 있는 클래스를 말합니다.
주의사항
일급 컬렉션을 만들 때 인수로 전달받은 컬렉션이나 내부 컬렉션을 반환할 때 불변성을 보장하기 위해 복사본을 저장해야합니다.
외부에 전달된 컬렉션이 변경되더라도 일급 컬렉션 내부의 상태가 영향을 받지 않기 때문입니다.
-
컬렉션 내 요소도 불변 객체로 선언해야합니다.
불변 객체가 아닐 경우 깊은 복사가 아니라면 요소 수정이 가능하며, 깊은 복사를 할 경우 리소스가 많이 필요하기 때문입니다.
장점
-
컬렉션과 관련된 로직이 하나의 클래스로 관리되어 응집도가 높아집니다.
응집도가 높다는 의미는 객체가 가진 데이터와 함수(메서드) 끼리 의존도가 높다는 의미입니다.
응집도가 낮으면, 관련 없는 기능들이 들어와 있다는 의미로 관련된 기능을 찾거나 수정하기 어렵고 캡슐화도 깨지게 된다고 생각합니다.
-
불변성을 보장하고 외부에서 수정할 수 없으므로 데이터 무결성을 보장합니다
내부 컬렉션을 수정할 수 없는 메서드를 제공하지 않고, 변경시 새 컬렉션을 생성하는 방식으로 불변성을 보장할 수 있습니다.
-
일급 컬렉션에 관련된 로직이 분리되어 테스트하기 편하고, 개별 제약 사항을 추가할 수 있습니다
만약 비즈니스 로직에 컬렉션 조작이 있다면 개별로 테스트하기 어렵고, 컬렉션에 대한 제약 사항도 내부 로직에서 추가하여 관리할 수 있습니다.
-
코드 중복이 감소됩니다. 관련된 일급 컬렉션을 사용하여 내부 로직을 재사용할 수 있습니다
컬렉션과 관련된 비즈니스 로직을 일급 컬렉션 내에서 처리하여 동일한 컬렉션 조작의 반복된 코드를 줄일 수 있습니다.
사용방법
-
컬렉션 하나를 필드로 갖는 클래스를 생성합니다.
-
캡슐화를 위해
private
과 외부 노출이 되지 않도록 합니다 -
컬렉션을 내부에서 필요한 정보만 반환되도록 합니다.
-
일급 컬렉션도 불변객체로 만들어서 사용해야하므로 내부에서 컬렉션내 요소를 수정하지 않도록 합니다.
수정해야한다면 수정된 결과를 새 일급 객체로 만들어 반환하는 방법을 사용할 수 있습니다.
- 컬렉션에 담겨진 객체들도 모두 불변으로 만들거나 복사본으로 저장해야합니다.
- 따라서 불필요한 객체를 만들지 않기 위해 컬렉션내 객체는 불변객체로 사용하는 것이 좋습니다.
List.copyOf와Collections.unmodifiableList 차이
두 메서드 모두 인수로 전달 받은 컬렉션의 복사본을 만들어줍니다.
반환된 복사본은 추가, 수정, 삭제 등 리스트 내 요소를 조작할 수 없습니다.
List.copyOf
는 원본 리스트를 복사하여 새로운 리스트를 반환하므로 원본이 변경되어도 영향을 받지 않습니다.Collections.unmodifiableList
는 원본 리스트를 읽기전용으로 감싼 결과를 반환하기 때문에 원본 객체가 변경되면 영향을 받습니다
댓글남기기