Java

리스트 값을 교체할까, 추가할까? 자바 리스트 처리 방식의 이해

제주니어 2024. 9. 25. 23:32

 

 

 

 

이번 글에서는 코드 리뷰에서 자주 발생할 수 있는 문제 중 하나인 리스트 값 처리 방식에 대해 다뤄보겠습니다.

특히, 리스트를 교체할지 추가할지에 대한 결정을 어떻게 해야 하는지, 간단한 예시를 통해 설명하겠습니다.

 

자바 리스트 초기화 문제
  • 자바에서 리스트를 사용할 때, 가장 기본적인 실수 중 하나는 리스트를 초기화하지 않고 값을 추가하거나 대체하려고 시도하는 것이다.
  • 리스트를 선언만 하고 초기화하지 않으면, 해당 변수는 null 상태로 남게 된다. 이후 리스트에 값을 설정하거나 추가하려고 하면 NullPointerException이 발생할 수 있다. 

 

초기화하지 않은 리스트의 문제
import java.util.List;

public class ProductManager {
    private List<String> productList;

    public void addProducts(List<String> newProducts) {
        productList.addAll(newProducts); // NullPointerException 발생 가능
    }
}
  • 위 코드에서는 productList가 초기화되지 않았기 때문에, addAll()을 호출할 때 NullPointerException이 발생한다.
  • 이를 해결하려면, 리스트를 명시적으로 초기화해야 한다.

 

리스트 초기화 후 값 추가
import java.util.ArrayList;
import java.util.List;

public class ProductManager {
    private List<String> productList;

    public ProductManager() {
        productList = new ArrayList<>(); // 리스트 초기화
    }

    public void addProducts(List<String> newProducts) {
        productList.addAll(newProducts); // NullPointerException 방지
    }
}
  • 이제 리스트가 new ArrayList<>()로 초기화되었으므로, addAll()을 호출해도 문제가 발생하지 않는다.

 

리스트 값을 교체 vs 추가: 어떤 경우에 무엇을 선택할까?
  • 리스트를 다룰 때, 중요한 결정 중 하나는 값을 교체할 것인지, 추가할 것인지이다.
  • 이 두 가지 방식은 코드의 동작 방식에 큰 차이를 가져올 수 있다.

 

값을 교체하는 방식 (set)
  • 리스트의 기존 데이터를 모두 삭제하고 새로운 데이터로 교체하려면 set과 같은 방식을 사용할 수 있다.
  • 아래 예시는 기존 리스트를 새로운 리스트로 대체하는 방식이다.
public void replaceProducts(List<String> newProducts) {
    productList = new ArrayList<>(newProducts); // 기존 리스트를 새로운 리스트로 교체
}
  • 이 방식은 기존 데이터를 전부 삭제하고 새로운 데이터로 대체하기 때문에, 과거 데이터가 더 이상 필요하지 않을 때 유용하다.

 

값을 추가하는 방식 (addAll)
  • 반면, 기존 리스트에 새로운 데이터를 추가해야 하는 경우 addAll을 사용할 수 있다.
  • 이 방식은 기존 데이터를 그대로 유지하면서 새로운 데이터를 더하는 방법이다.
public void addProducts(List<String> newProducts) {
    productList.addAll(newProducts); // 기존 리스트에 새로운 데이터 추가
}
  • 이 방식은 기존 데이터를 보존하고 새로운 데이터를 추가할 때 유용하다.
  • 기존 데이터가 중요하고, 데이터를 축적해야 하는 상황에서 많이 사용된다.

 

교체와 추가: 언제 무엇을 선택해야 할까?

교체 (set 방식)를 사용하는 경우

  • 기존 데이터가 더 이상 유효하지 않거나 필요 없는 경우: 예를 들어, 데이터가 완전히 갱신되어야 할 때 사용합니다.
  • 데이터가 정기적으로 초기화되는 상황: 예를 들어, 주기적으로 새로운 데이터로만 작업해야 할 때 리스트를 교체하는 것이 적절합니다.

 

추가 (addAll 방식)를 사용하는 경우

  • 기존 데이터를 보존해야 하는 경우: 과거 데이터도 계속 사용되어야 하거나, 데이터가 쌓여야 할 때 사용한다.
  • 리스트에 점진적으로 데이터를 추가하는 경우: 예를 들어, 사용자가 여러 번 데이터를 추가할 수 있고, 그 데이터를 모두 유지해야 하는 상황에서 사용된다.

 

성능 및 유지보수성 고려

  • 이 두 방식은 성능 측면에서 큰 차이를 보이지 않지만, 유지보수성에서는 차이가 발생할 수 있다.
  • set 방식은 기존 데이터를 모두 덮어쓰므로 의도치 않게 중요한 데이터를 삭제할 위험이 있다.
  • 반면, addAll 방식은 기존 데이터를 유지하면서 새로운 데이터를 추가하기 때문에 더 안전한 방식이다.
  • 특히, 데이터 일관성을 유지하는 것이 중요한 상황에서는 addAll을 사용하는 것이 더 적합하다.

 

결론
  • 리스트 초기화는 필수: 리스트를 사용하기 전에 반드시 초기화하여 NullPointerException과 같은 오류를 방지해야 한다.
  • 교체와 추가는 상황에 맞게 선택: 데이터를 완전히 대체할지, 추가할지를 결정할 때는 데이터의 일관성과 유지보수성을 고려해야 한다.