TENSOR STUDIO
자바의 contain() 메소드는 배열에서 제대로 작동하지 않는다. 다시 말하면, 예를 들어서 ArrayList에 int[] 타입의 배열을 넣고, contains() 메소드를 사용하여 같은 값을 가진 배열을 찾아내는 것이 불가능하다.
하지만 ArrayList에 Integer 타입의 배열을 넣고, contains() 메소드를 사용하여 같은 값을 가진 배열을 찾아내는 것은 가능하다.
분명 contains() 메소드도 eqauls() 메소드를 사용하여 값을 비교하도록 되어있는데, ArrayList
왜 가능할까?
package boj;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class equal_test {
public static void main(String[] args) {
// 테스트용 ArrayList 생성
ArrayList<int[]> testArrayList = new ArrayList<>();
int[] targetIntArray = {1, 2};
testArrayList.add(targetIntArray);
boolean question1 = testArrayList.contains(targetIntArray);
System.out.println(question1);
// true 출력
// 같은 값을 가진 배열을 생성하여 contains() 메소드를 사용
int[] sameValueArray = {1, 2};
boolean question2 = testArrayList.contains(sameValueArray);
// false 출력
System.out.println(question2);
}
}
아마 감이 좋다면 String에서 == 연산자와 equals() 메소드의 차이점을 떠올리며 감을 잡을 수 있을 것이다. String의 경우에는 == 연산자를 사용하여 두 String의 주소를 비교하고, equals() 메소드를 사용하여 두 String의 값을 비교했었다. contain() 역시 equal() 메소드를 사용한다. 그렇다면 왜 같은 값을 가진 배열을 찾아내지 못할까?
위 코드의 예시를 통해 확인할 수 있듯, 배열의 경우 contains() 메소드를 사용하여 같은 값을 가진 배열을 찾아내는 것이 불가능하다. 디버거를 이용해서 주소를 확인해 보면 다음과 같은데 배열 변수의 주소가 다른 것을 확인할 수 있다. 하지만 배열 변수의 주소가 다르기 때문에 false를 반환하는 것이 아니다. ArrayList의 equals() 메소드는 단순히 배열 변수의 주소만을 비교하지는 않는다. 이는 다음 코드를 확인하면 더욱 명확해진다.
package boj;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class equal_test {
public static void main(String[] args) {
// 테스트용 ArrayList 생성
ArrayList<ArrayList<Integer>> testArrayList = new ArrayList<>();
// ArrayList에 Integer 타입의 ArrayList를 넣음
ArrayList<Integer> targetIntArrayList = new ArrayList<>();
targetIntArrayList.add(1);
targetIntArrayList.add(2);
testArrayList.add(targetIntArrayList);
boolean question1 = testArrayList.contains(targetIntArrayList);
System.out.println(question1);
// true 출력
ArrayList<Integer> sameValueArray = new ArrayList<>();
// 같은 값을 가진 ArrayList를 생성하여 contains() 메소드를 사용
sameValueArray.add(1);
sameValueArray.add(2);
boolean question2 = testArrayList.contains(sameValueArray);
System.out.println(question2);
// true 출력
}
}
위 코드를 실행해 보면 알 수 있듯, 배열과는 달리, 같은 값을 가진 ArrayList
이는 ArrayList
또한 ArrayList
그래서 ArrayList