본문 바로가기

Java

[JAVA] List.remove(Int) VS remove(Integer)

728x90

코딩테스트 문제를 풀면서 몰랐던 사실을 알게되어 기록하기 위해 글을 쓴다.

 

🕶️ 알게된 것

지금까지 List 의 remove 메서드의 파라미터로 항상 '인덱스'를 넘겨줘야 하는 것으로 알았다.

 

실제로 remove 메서드의 설명에서 Parameters 를 보면 'index' , 삭제를 하기 위한 원소의 인덱스

파라미터로 넘겨달라고 적혀있다. 따라서 remove 메서드에 int형 데이터를 전달하면

List 내에 있는 원소들의 인덱스 중, 파라미터로 전달된 데이터 값의 인덱스를

찾아 삭제한다.

 

하지만 remove 메서드에 int형 데이터가 아닌 Integer형 데이터를 전달하면 결과가

전혀 달라짐을 확인할 수 있다.

 

🚨 CODE

public class Main {

	public static void main(String[] args) {
		List<Integer> list = new ArrayList<>();
		list.add(1);
		list.add(2);
		list.add(3);
		list.add(4);
        
		System.out.println(list.toString());
		list.remove(2); // int
		System.out.println(list.toString());
		list.remove(2); // int
		System.out.println(list.toString());
	}

}

 

다음과 같이 코드를 짰다고 가정해보자.

코드는 List 에 1,2,3,4 정수형 데이터를 add하고 List내 원소에서

인덱스가 2인 원소를 2번 remove하는 것이다.

결과는 다음과 같다. 

초기 1,2,3,4 에서 2번째 인덱스인 3이 삭제되고

1,2,4 에서 다시 2번째 인덱스인 4가 삭제되어 1,2가 남아있는 모습을 확인할 수 있다.

 

public class Main {

	public static void main(String[] args) {
		List<Integer> list = new ArrayList<>();
		list.add(1);
		list.add(2);
		list.add(3);
		list.add(4);
		System.out.println(list.toString());
		list.remove(2); // int
		System.out.println(list.toString());
		list.remove(Integer.valueOf(2)); // Integer
		System.out.println(list.toString());
	}

}

 

두번째 remove 메서드에서 int형 데이터가 아닌 Integer 데이터(객체)를 전달하도록

원래의 코드에서 살짝 변화를 줘 봤다.

결과는 어떻게 될까? 전과 결과가 같지 않을까? 라고 생각했었다.

 

하지만 실제 결과는 다음과 같다.

초기 코드처럼 2번째 인덱스를 삭제하고 다시금 2번째 인덱스를 삭제했다면

1,2 가 남아야하는데, 1,4가 남았다.

두번째 remove에서 index = 2인 4가 삭제되어야하는데 wrapper class 인

Integer 형 데이터를(엄밀히 말하면 객체를) remove 메서드의 파라미터로 전달함으로써

index = 2 가 아닌 List 내 원소값이 "2"인 원소를 찾아 remove를 수행했음을 알 수 있다.

 

지금까지 Integer 와 int 는 그냥 같은 타입 아닌가? 라고 생각했지만

이것을 계기로 둘은 엄연히 다른 부분이 존재한다고 생각이 들었다.

사실 int = 데이터의 자료형을 나타내고 Integer는 Object 객체이니 

다르다고 생각하는게 당연한거 같기도 하다.

 

List 내에 원소의 인덱스를 찾아 지우는 것원소 자체를 찾아 비교하여

지우는 것은 엄연히 다른 작업이고 만약 이 사실을 모르고 remove파라미터를 

그냥 넘겨줬다면 나중에 코딩테스트나 프로젝트에서 애를 먹었을 것이기 때문에

코테 연습중에 알게 된 것이 다행이라는 생각이 든다.

 

✅ 결론

List(혹은 다른 Collection들)의 remove를 수행할 때 인덱스를 찾아 remove를 수행하고자 한다면

remove(int)를, 전달한 객체를 Collection 내에서 찾아 remove를 수행하고자 한다면

remove(Integer)를 사용하자.

 

 

728x90
반응형

'Java' 카테고리의 다른 글

자바 : 클래스와 객체  (0) 2024.02.06
자바 : 배열과 예외 처리  (0) 2024.02.05
자바 : 자바의 데이터 타입  (0) 2024.02.05
자바 : 자바의 태동  (0) 2024.02.04
[JAVA] length, length(), size() 의 차이  (0) 2024.01.18