이번 포스팅에서는 Spring Boot로 백엔드로직 구현중 삭제 로직을 구현하며 발생했던 ArrayList에 관련한 문제를 다루도록 하겠습니다.
1. ArrayList remove 문제
xxxxxxxxxx
public class MainTest {
private static List<Integer> list = new ArrayList<>();
public static void deleteData(Integer index) {
list.remove(index);
}
public static void main(String[] args) {
list.add(1);
list.add(2);
deleteData(0);
for(Integer num : list) {
System.out.println(num);
}
}
}
== 결과 ==
1
2
상황은 이렇습니다. ArrayList
를 이용하여 데이터를 저장하고, ArrayList의 remove()메소드를 이용하여 데이터를 지우려는 상황이었습니다. 하지만 결과는 데이터가 지워지지 않았습니다.
2. 이유
이유는 위의 그림을 보면 알 수 있습니다. ArrayList에서 제공하는 remove()메소드는 오버로딩
되어 2개가 존재했습니다. 이때 하나는 Object
를 매개변수로 전달받고 나머지 하나는 int
를 매개변수로 전달받습니다.
public static void deleteData(Integer index) {
list.remove(index);
}
그래도 모르시겠다면, 이 메소드의 매개변수를 주목해주세요. 매개변수로 기본 타입 int
의 Wrapper Class
인 Integer
를 매개변수로 받고 있습니다. 즉 객체를 매개변수로 받고 있는 것이죠, 그래도 이유를 모르시겠다면 아래에서 조금더 자세히 알아보겠습니다.
2.1 ArrayList의 remove(Object o) 메소드
위의 코드는 ArrayList의 remove(Object o) 메소드입니다. 이 메소드는 list를 하나하나 살피면서 매개변수로 전달받은 객체와 같은(equals)
객체가 존재하는 경우 그것을 삭제하고 true를 반환합니다. 따라서 우리는 매개변수로 index를 전달하려 했지만 객체가 전달되었기 때문에 해당 객체와 완전히 동일한 객체가 리스트에 존재하지 않기 때문에 리스트에 변화가 없던 것입니다.
3. 해결
xxxxxxxxxx
public static void deleteData(int index) {
list.remove(index);
}
== 결과 ==
2
해결 방법은 간단합니다. Wrapper클래스가 아닌 primitive 타입을 매개변수로 전달받아 삭제메소드를 이용하면 됩니다.
'Language > Java' 카테고리의 다른 글
Java - Retrofit이란? (retrofit 사용법 자세한 설명) (2) | 2019.08.24 |
---|---|
Java - jjwt 사용법 (1) | 2019.07.11 |
Java - Annotation 이란? Annotation 사용법 (0) | 2019.05.02 |
Java - Lambda Expression(람다식)이란? (2) | 2019.04.09 |
Java - Json 과 Gson 이란? (0) | 2019.03.30 |