두 방식 비교
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); // 읽기 전용으로 반환
}
'Java > 코드 개선 (Refactoring)' 카테고리의 다른 글
Optional 제대로 사용하기 (1) | 2025.04.19 |
---|---|
유효성 검사는 어디에서 해야 될까? (0) | 2025.04.18 |