예전에 내가 포스팅한 객체지향 생활체조를 살펴보면 8번 항목에 일급 컬렉션을 써라 부분에 해당 내용이 간단하게 기술되어있다.
다시한번 설명하자면 일급 컬렉션이란 Collection을 wrapping하고 그 외 다른 멤버변수가 없는 상태를 말한다.
장점부터 간단하게 말하면 일급 컬렉션을 통해 Collection의 불변성 보장, 비즈니스에 종속적인 자료구조 등을 얻을 수 있다.
어떻게 이런 장점을 얻을 수 있는지 살펴보자
Collection은 자바에서 데이터를 효율적으로 관리하기 위해 만들어진 프레임워크이다.
보통 여러개의 개수를 가지는 데이터를 다루는데 필요한 데이터구조를 사용할때 적용한다.
핵심 인터페이스는 우리가 흔히 사용하는 List, Set, Map이 있고 모두 여러 개수의 데이터가 있는 묶음을 다룰때 사용하는 자료구조이다.
각각의 자료구조들은 다양한 함수들을 사용해 여러 동작들을 수행 할 수 있고, 이를 통해 Collection을 사용하지않을때보다 성능을 향상시키고, 다양한 기능들을 이용할 수 있다.
Java 5의 Generic이나 Java 8의 Stream 도 모두 Collection을 더 쉽게 다루기위해 업데이트된 내용들이다.
쉽게 말해 일급 컬렉션은 이 Collection들을 캡슐화한 클래스를 말하는데, 직접 Collection을 다루지않고 이 Collection을 감싸서 캡슐화한 클래스를 이용해 데이터에 접근하겠다는 의미이다.
캡슐화를 통해 객체지향적으로 데이터들을 다룰 수 있다.
public class Orders {
private final List<Order> orders;
public Orders(List<Order> orders) {
validate(orders); // 검증 수행
...
}
public void add(Order order) {
if (order == null) {
throw new IllegalArgumentException("Order cannot be null");
}
orders.add(order);
}
public List<Order> getAll() {
return Collections.unmodifiableList(orders);
}
public double getTotalAmount() {
return orders.stream()
.mapToDouble(Order::getAmount)
.sum();
}
}
이렇게 생긴 클래스가 바로 일급컬렉션이다.
Order들이 List의 형태로 이루어져있는 orders를 다루는 Orders 클래스인데, Collection 종류 중 하나인 List를 감싸고 있는 클래스이면서 동시에 List<Order> orders 를 제외한 다른 멤버변수가 존재하지 않는다.
지금 Orders는 검증로직을 포함하고있다. 들어와야하는 데이터의 조건들을 검증메소드를 통해 추가할 수 있다.
일급컬렉션을 만들지 않았다면 새로운 orders를 만들때마다 검증을 거쳐야하지만
public class OrderService {
private final Orders orders = new Orders();
public void addOrder(Order order) {
orders.add(order);
}
public Orders getOrders() {
return orders;
}
// 추가 비즈니스 로직...
}
일급컬렉션이라는 자료구조를 만들게되면서 orders 선언하면서 간편하게 내부 검증로직을 타게 할 수 있다.
평소 이름이 없는 Collection에 클래스명을 통해 의미있는 이름을 부여할 수 있다.
이는 비즈니스에 특화된 이름을 사용하여 다른 동료 개발자들에게 오는 혼동을 줄일 수 있다.
클래스 내부에 값을 조회하고 추가하는 메소드만 존재하게하고 수정또는 삭제를 할 수 있는 메소드를 만들지 않게하면서 Collectiond의 불변성을 유지할 수 있다.
면접 질문 내용과 답변의 일부는 기술 면접 구독 서비스 - 매일메일 에 있다.
흥미로웠다면 구독해보는 것도 추천한다!