[Java] List, 객체를 value로 활용하기 (객체 중첩)

2025. 10. 23. 13:04Dev./Java

728x90
반응형

List도 하나의 value로 취급 할 수 있다. 

List를 value로 사용하면 하나의 엔티티가 여러 데이터를 갖는 복합 구조를 쉽게 표현 할 수 있다.

예시

class Menu {
  private String name;
  private List<MenuItem> menuItems; // List를 값으로 사용
}

List<MenuItem> coffeeItems = new ArrayList<>();
coffeeItems.add(new MenuItem("아메리카노", 4500));
coffeeItems.add(new MenuItem("카페 라떼", 5500));

Menu coffeeMenu = new Menu("Coffee", coffeeItems); 
Menu nonCoffeeMenu = new Menu("Non-Coffee", coffeeItems);

 

  • Menu 객체 하나 = 카테고리
  • menuItems = 카테고리가 가진 메뉴 항목 전체 (여러 개의 값)
  • List 자체가 값의 묶음으로 사용됨
  • coffeeMenu라는 객체 하나가 여러 메뉴 아이템(List)을 값으로 가짐.

주의해야할 사항

동일한 객체를 참조하게 되는 경우가 생길 수 있다.

class MenuItem {
    private String name;
    private int price;
    public MenuItem(String name, int price) { this.name = name; this.price = price; }
}

class Menu {
    private String categoryName;
    private List<MenuItem> menuItems; // List를 값으로 사용

    public Menu(String categoryName, List<MenuItem> menuItems) {
        this.categoryName = categoryName;
        this.menuItems = menuItems; >>>> 여기서 참조가 공유됨
    }

    public List<MenuItem> getMenuItems() {
        return menuItems;
    }
}

 

  • menuItems 필드가 List 객체의 참조를 그대로 저장함.
  • 즉, 같은 List를 다른 곳에서 가져다 쓰면 동일한 객체를 참조하게 됨.

생길 수있는 문제

메뉴별로 독립적이어야 하는데, List 참조를 공유하면서 서로 영향을 주게 됨

List<MenuItem> coffeeItems = new ArrayList<>();
coffeeItems.add(new MenuItem("아메리카노", 4500));

Menu coffeeMenu = new Menu("Coffee", coffeeItems);
Menu nonCoffeeMenu = new Menu("Non-Coffee", coffeeItems); >>> 같은 리스트 공유하게됨

coffeeMenu.getMenuItems().add(new MenuItem("라떼", 5000));

System.out.println(nonCoffeeMenu.getMenuItems().size()); 
// 출력: 2 (아메리카노 + 라떼) 
// → nonCoffeeMenu에도 영향을 미침

해결 방안

1. 새 List 생성 (깊은 복사)

public Menu(String name, List<MenuItem> menuItems) {
        // 생성자에서 새로운 리스트로 복사 → 참조 공유 방지
        this.menuItems = new ArrayList<>(menuItems);
    }

 

  • 이렇게 하면 생성 시 전달된 menuItems를 새로운 리스트로 복사해서 Menu 객체가 독립적으로 관리함.
  • 외부에서 원래 리스트를 수정해도 Menu 내부 리스트에는 영향이 없음.

 

2. 읽기 전용 리스트 제공

public List<MenuItem> getMenuItems() {
	return Collections.unmodifiableList(menuItems);
}

 

  • 외부에서 add()를 못 하게 막아서 참조 공유 문제를 예방
  • 읽기만 가능, Kiosk 메뉴 표시용으로 안전

 

728x90
반응형