Java/코드 개선 (Refactoring)

getItems.add(...) vs addItem(...)

가지코딩 2025. 4. 21. 20:02

두 방식 비교

getItems.add(...)

import java.util.ArrayList;
import java.util.List;

public class ShoppingCart {
    private List<String> items = new ArrayList<>();

    // 컬렉션 반환 메서드
    public List<String> getItems() {
        return items;
    }

    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();
        
        // getItems() 호출 후 add()로 항목 추가
        cart.getItems().add("Aapple");
        cart.getItems().add("Banana");
        
        System.out.println(cart.getItems());  // Output: [Apple, Banana]
    }
}
      • getItems()로 내부 리스트(List)를 가져오고, 그 리스트에 add(...)를 호출하여 값을 추가한다.
      • 장점
        • 메서드 체이닝: getItems() 메서드가 컬렉션을 반환하면 그 즉시 add(...)를 호출할 수 있어 코드가 간결하다.
      • 단점
        • 내부 구현이 외부에 노출되어 캡슐화(encapsulation)가 깨진다.
        • 컬렉션을 반환하는 메서드가 List나 Set과 같은 mutable 객체라면, 의도치 않게 외부에서 수정될 수 있다.

 

addItem(...)

import java.util.ArrayList;
import java.util.List;

public class ShoppingCart {
    private List<String> items = new ArrayList<>();
	
    // 컬렉션을 직접 수정
    public void addItem(String item) {
        items.add(item);
    }

    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();
        cart.addItem("Apple");
        cart.addItem("Banana");

        System.out.println(cart.items);  // Output: [Apple, Banana]
    }
}

 

  • addItem() 메서드는 외부에서 직접 items 컬렉션을 수정할 수 없고, 내부에서만 항목을 추가할 수 있다.
  • 장점
    • 컬렉션이 외부로 노출되지 않으므로 캡슐화가 유지된다. 코드의 안정성이 높다.

getItems().add(...) 방식을 사용하는 경우

  • 간단한 코드 구현을 원할 때
  • Test 코드 구현 시
  • 간단한 로직 검증

그 외에는 꼭 addItem(...) 방식을 사용하자 !!!


캡슐화 유지하기

 

addItem(...) 방식으로 메서드 체이닝 구현

// 아이템을 추가하고, 자신을 반환하는 메서드
public ShoppingCart addItem(String item) {
    items.add(item);
    return this;  // 현재 객체(ShoppingCart)를 반환
}

 

 

getItems() 메서드에서 불변 컬렉션 반환

  • 불변 컬렉션을 반환
  • 컬렉션을 읽기만 할 수 있고, 수정하려고 시도하면 UnsupportedOperationException이 발생한다.
public List<String> getItems() {
    return Collections.unmodifiableList(items);  // 읽기 전용으로 반환
}