일급 컬렉션(First-Class Collection)은 컬렉션(List,Set)을 감싸는 클래스를 만들어 컬렉션을 객체로 다루는 디자인 패턴입니다. 이 패턴은 컬렉션을 단순한 데이터 구조가 아니라 의미 있는 객체로 취급하여 코드의 가독성과 유지보수성을 높이는 데 도움을 줍니다.
Collection을 포함한 클래스는 반드시 다른 멤버 변수는 없어야 합니다.
public class Item{
private final String name;
private final double price;
private final int quantity;
public Item(String name, double price, int quantity) {
this.name = name;
this.price = price;
this.quantity = quantity;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
public int getQuantity() {
return quantity;
}
@Override
public String toString() {
return name + " (가격: " + price + ", 수량: " + quantity + ")";
}
}
public class OrderItems {
private final List<Item> items;
public OrderItems(List<Item> items) {
this.items = new ArrayList<>(items);
}
public void addItem(Item item) {
items.add(item);
}
public List<Item> getItems() {
return Collections.unmodifiableList(items); // 또는 return this.items;
}
public int getTotalItems() {
return items.size();
}
public double getTotalPrice() {
return items.stream().mapToDouble(item -> item.getPrice() * item.getQuantity()).sum();
}
@Override
public String toString() {
return "주문 항목: " + items;
}
}
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
// 초기 주문 항목 생성
OrderItems orderItems = new OrderItems(Arrays.asList(
new Item("Apple", 1.0, 2),
new Item("Banana", 0.5, 5)
));
// 아이템 추가
orderItems.addItem(new Item("Orange", 0.8, 3));
// 아이템 조회
System.out.println(orderItems);
System.out.println("총 아이템 수: " + orderItems.getTotalItems());
System.out.println("총 가격: " + orderItems.getTotalPrice());
}
}
일급 컬렉션은 복잡한 비즈니스 로직을 다루는 애플리케이션에서 특히 유용합니다. 데이터의 무결성을 유지하고, 관련된 기능을 한 곳에서 관리할 수 있어 코드의 유지보수성을 높이는 데 기여합니다. 또한, 코드의 가독성을 향상시켜 팀원 간의 협업을 원활하게 합니다.