기본 개념을 이해하는 것이 중요하므로 간단하게 다음과 같이 1부터 10까지 리스트에 추가합니다.

    List<Integer> list = new ArrayList<>();
    
    for(int i=1;i<=10;i++) {
        list.add(i);
    }
    System.out.println(list);

print하면 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]가 출력됩니다.

 

여기서 삭제하고 싶은 값이 10이라고 해보고 다음과 같이 입력해본다고 합시다.

    list.remove(10);

remove메소드의 파라미터는 index값을 받게 되어 있습니다.

index는 0부터 시작하므로 위에 있는 list객체에는 10번의 index가 존재하지 않아 IndexOutOfBoundsException가 발생하게 됩니다.

 

여기서 숫자 10을 삭제하고 싶을 때 어떻게 해야 할까요?

    list.remove(new Integer(10));
    
    System.out.println(list);

위와 같이 래퍼 클래스(Wrapper Class)로 감싸서 파라미터 값을 넘겨주면 됩니다.

 

이제 출력값은 다음과 같습니다.

[1, 2, 3, 4, 5, 6, 7, 8, 9]

 

우리가 원했던대로 10이 삭제되었습니다.

 

Java에서 수치나 논리값은 객체가 아니라 기본형으로 관리됩니다. 그런데 List나 Map과 같은 컬렉션 클래스 안에서는 객체만 저장할 수 있습니다. 그렇기 때문에 기본형을 객체로 감싸줘야 하는데 이러한 역할을 하는 것이 래퍼 클래스입니다. 

 

이러한 개념을 바탕으로 List에 숫자 10을 담기 위해서는 다음과 같이 해야 합니다.

    int ten = 10;
    
    Integer wrap_ten = new Integer(ten);
    
    List<Integer> list = new ArrayList<>();
    list.add(wrap_ten);
    
    System.out.println(list);

그런데 굳이 위처럼 하지 않고 다음과 같이 int값을 바로 넣어도 List에 추가가 되는 것을 알 수 있습니다.

    int ten = 10;

    List<Integer> list = new ArrayList<>();
    list.add(ten);
    
    System.out.println(list);

자바가 자동으로 int값을 래퍼 클래스로 변환해주기 때문입니다. 참고로 기본형에서 래퍼 클래스로 변환해주는 것을 '오토박싱'이라고 합니다. 

 

다시 이 글의 주제인 'List에서 특정 index가 아닌 원하는 값 삭제'로 돌아가 보겠습니다.

 

그러면 왜 remove 메소드에 10을 넘겼을 때 왜 래퍼 클래스로 변환해주지 않는 것이냐 라는 의문이 들 수 있습니다. 

 

List 객체의 특성을 다시 생각해보면 됩니다.

List에서 어떠한 작업을 하기 위한 키는 기본적으로 index입니다. 그러므로 remove 메소드 파라미터의 기본은 index인 것입니다. 몇 번째 index에 위치한 것을 우리가 호출한 메소드에 맞게 처리해라가 기본인 것입니다. 

 

그러므로 List에서 index가 아니라 우리가 생각하는 그 숫자를 삭제하려면 래퍼 클래스로 감싸서 파라미터로 넘겨야 합니다. 

 

그렇다면 Java가 List 안에서 우리가 생각하는 것처럼 숫자 10을 인식해서 삭제하는 것일까요?

 

객체의 기본 개념을 생각해봅시다. 이해하기 쉽게 객체는 주소와 값으로 구성된 map과 같은 것입니다. 파이썬에서는 Dictionary 같은 것입니다. 

 

이 글 처음에 for문을 이용해서 1부터 10까지 숫자를 List에 추가하였습니다. 이 때 내부적으로 1부터 10까지 각각 래퍼 클래스로 전부 감싼 후 List에 추가한 것입니다. 그러므로 1부터 10까지 숫자가 있는 것이 아니라 1부터 10까지 주소와 값으로 구성된 객체 10개가 만들어진 것입니다.

 

그러므로 list.remove(new Integer(10))을 실행했을 때 자바가 List 안에서 숫자 10을 인식한 게 아니라 10이 위치한 주소를 찾아 그 객체를 삭제한 게 되는 것입니다.

 

 

 

 

'프로그래밍 > Java' 카테고리의 다른 글

[자바] Open API에서 xml 파싱(parsing)하기  (0) 2020.12.17

+ Recent posts