코드의 품질을 높이기 위해 고민하던 도중 일급 컬렉션을 활용해 보기로 결정하였습니다.🙌
일급 컬렉션에 대해 알아보도록 하겠습니다.
일급 컬렉션이란?
일급 컬렉션(First-Class Collection)은 하나의 컬렉션(List, Set, Map 등)을 캡슐화한 크래스를 의미합니다.
즉, 컬렉션 자체를 클래스로 래핑(wrapping)하여 컬렉션과 관련된 로직을 해당 클래스 내부에 숨기는 것입니다.
이러한 일급 컬렉션은 단일 책임 원칙(Single Responsibility Principle)을 지키며, 컬렉션을 직접 다루는 것보다 더 많은 장점을 제공합니다.
왜 일급 컬렉션을 사용해야 하는가?
- 캡슐화의 응집도
일급 컬렉션은 컬렉션과 관련된 로직을 한 곳에 모아두기 때문에 응집도가 높아지고 캡슐화가 잘 유지됩니다.
이는 유지보수성을 높여줍니다. - 컬렉션의 불변성 유지
컬렉션을 직접 노출하지 않고 메서드를 통해 접근하게 함으로써 컬렉션의 불변성을 유지할 수 있습니다.
이는 데이터 무결성을 보장하는데 도움이 됩니다. - 비즈니스 로직의 이동
컬렉션에 대한 다양한 비즈니스 로직을 일급 컬렉션 내부로 이동시켜, 도메인 모델이 더욱 깔끔해집니다.
이는 코드의 가독성과 유지보수성을 높입니다. - 컬렉션에 대한 명확한 의도 표현
컬렉션을 직접 사용하는 것보다, 일급 컬렉션을 사용함으로써 코드에서 의도를 명확하게 표현할 수 있습니다.
이는 코드의 이해도를 높여줍니다.
일급 컬렉션의 장점
- 코드의 가독성 향상
컬렉션에 대한 비즈니스 로직을 일급 컬렉션에 몰아넣음으로써, 도메인 모델이 단순해지고 코드의 가독성이 향상됩니다. - 버그 감소
컬렉션의 불변성을 유지함으로써 예기치 않은 버그 발생을 줄일 수 있습니다. - 유지보수성 증가
일급 컬렉션 내부에 관련 로직이 모여있어, 유지보수성이 증가합니다.
일급 컬렉션 예제
다음은 일급 컬렉션을 사용하여 코드의 품질을 높이는 예제입니다.
일급 컬렉션을 사용하지 않는 코드를 먼저 확인해 보겠습니다.
public class Order {
private List<Item> items;
public Order(List<Item> items) {
this.items = items;
}
public void addItem(Item item) {
items.add(item);
}
public void removeItem(Item item) {
items.remove(item);
}
public List<Item> getItems() {
return items;
}
}
일급 컬렉션을 사용하는 경우는 아래와 같습니다.
public class Order {
private Items items;
public Order(Items items) {
this.items = items;
}
public void addItem(Item item) {
items.add(item);
}
public void removeItem(Item item) {
items.remove(item);
}
public List<Item> getItems() {
return items.getItems();
}
}
public class Items {
private final List<Item> items;
public Items(List<Item> items) {
this.items = new ArrayList<>(items);
}
public void add(Item item) {
items.add(item);
}
public void remove(Item item) {
items.remove(item);
}
public List<Item> getItems() {
return Collections.unmodifiableList(items);
}
public int size() {
return items.size();
}
public boolean contains(Item item) {
return items.contains(item);
}
public double getTotalPrice() {
return items.stream()
.mapToDouble(Item::getPrice)
.sum();
}
}
public class Item {
private String name;
private double price;
public Item(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
}
주요 차이점은 아래와 같습니다.
Items 일급 컬렉션 클래스
- Items 클래스는 List<Item>을 포함하고, 관련된 모든 로직을 캡슐화합니다.
- add, remove, contains 등의 메서드를 제공하여 Order 클래스가 직접 리스트를 조작하지 않도록 합니다.
- getTotalPrice 메서드를 통해 전체 아이템의 가격을 계산하는 비즈니스 로직을 포함할 수 있습니다.
- Collections.unmodifiableList(items)를 통해 불변 리스트를 반환하여 외부에서 리스트를 수정할 수 없도록 합니다.
Order 클래스
- Order 클래스는 이제 List<Item> 대신 Items 일급 컬렉션을 사용하여 아이템을 관리합니다.
- Order 클래스는 더 이상 컬렉션을 직접 다루지 않으며, 관련 로직을 Items 클래스에 위임합니다.
💡 일급 컬렉션은 단순히 컬렉션을 감싸는 것 이상의 의미를 가지고 있습니다.
이는 컬렉션과 관련된 로직을 한 곳에 모아두고, 코드의 가독성과 유지보수성을 높이며, 데이터의 불변성을 보장합니다.
일급 컬렉션을 도입함으로써 더 나은 코드 품질을 유지하고, 유지보수와 확장에 유리한 코드를 작성할 수 있습니다.
'Java' 카테고리의 다른 글
[Java] for 루프와 Stream API (0) | 2024.08.10 |
---|---|
[Java] final 불변 객체를 사용해야하는 이유 (0) | 2024.08.10 |
[Java] 객체 지향 설계(Object-Oriented Design, OOD) (0) | 2024.07.28 |
[Java] ConcurrentHashMap 멀티스레드 환경에서 안전한 해시맵 (0) | 2024.07.28 |
[Java] computeIfAbsent 효율적인 데이터 캐싱과 값 처리 (0) | 2024.07.27 |