일급컬렉션

김상진 ·2024년 11월 25일
0

CS

목록 보기
13/30

일급컬렉션

일급 컬렉션(First-Class Collection)은 컬렉션(List,Set)을 감싸는 클래스를 만들어 컬렉션을 객체로 다루는 디자인 패턴입니다. 이 패턴은 컬렉션을 단순한 데이터 구조가 아니라 의미 있는 객체로 취급하여 코드의 가독성과 유지보수성을 높이는 데 도움을 줍니다.

Collection을 포함한 클래스는 반드시 다른 멤버 변수는 없어야 합니다.

  • 부가설명 : Collection(List, Set)을 Wrapping한 변수가 있다면 다른 멤버 변수는 없어야합니다.

Item 클래스

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 + ")";
	}
}
	

OrderItems 클래스

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());
    }
}

장점

  • 캡슐화: 컬렉션을 감싸는 클래스를 사용함으로써 컬렉션의 내부 구현을 숨길 수 있습니다. 외부에서는 OrderItems 객체를 통해서만 접근할 수 있습니다.
  • 의미 있는 메서드 제공: 컬렉션에 관련된 메서드를 클래스에 포함시켜, 관련된 기능을 한 곳에서 관리할 수 있습니다. 예를 들어, getTotalPrice()와 같은 메서드는 OrderItems 클래스에 자연스럽게 포함됩니다.
  • 불변성: getItems() 메서드에서 Collections.unmodifiableList()를 사용하여 외부에서 컬렉션을 수정할 수 없도록 하여 데이터의 무결성을 유지할 수 있습니다.
  • 상태과 행위를 한 곳에서 관리

단점

  • 추가적인 클래스 생성: 일급 컬렉션을 사용하면 추가적인 클래스를 생성해야 하므로 코드가 다소 복잡해질 수 있습니다.
  • 성능 오버헤드: 컬렉션을 감싸는 클래스가 추가되면, 메서드 호출 시 약간의 성능 오버헤드가 발생할 수 있습니다. 그러나 일반적으로 이 오버헤드는 미미합니다.
  • 단순한 컬렉션에는 과할 수 있음: 단순한 데이터 구조를 다룰 때는 일급 컬렉션이 필요하지 않을 수 있습니다. 이 경우, 단순한 리스트나 배열을 사용하는 것이 더 간단할 수 있습니다.

사용 이유

일급 컬렉션은 복잡한 비즈니스 로직을 다루는 애플리케이션에서 특히 유용합니다. 데이터의 무결성을 유지하고, 관련된 기능을 한 곳에서 관리할 수 있어 코드의 유지보수성을 높이는 데 기여합니다. 또한, 코드의 가독성을 향상시켜 팀원 간의 협업을 원활하게 합니다.


출처 및 참고자료

[Java] 만취한 사람도 쉽게 이해할 수 있는 '일급 컬렉션'에 대해 알아보자!

profile
알고리즘은 백준 허브를 통해 github에 꾸준히 올리고 있습니다.🙂

0개의 댓글

관련 채용 정보