equals() 는 메소드로 객체의 내용을 비교한다.
기존 equals()의 경우 Object 클래스의 메서드로, ==연산자와 동일하게 주소값을 비교한다.
하지만 흔히 문자열 비교를 위해 사용하는 equals()의 경우 String 클래스에서 오버라이딩을 함으로써 문자열 간의 비교가 가능해졌다
==는 주소값을 비교한다
==연산자의 경우 객체의 주소값을 비교한다. 그래서 비교하는 객체가 동일한 객체인지를 판별한다.
Primitive Type
의 객체에서는 값 비교, Reference Type
에서는 주소비교를 수행한다.
참고로 Primitive Type 객체는 Constant Pool의 특정한 값을 참조하는 변수이기 때문에, 결국 Constant Pool 내의 동일한 주소를 비교한다.
String 변수를 생성하는 방법 중 하나로
리터럴을 사용하게 되면 string constant pool이라는 영역에 존재하게 되고
new를 통해 String을 생성하면 Heap 영역에 존재하게 된다
String을 리터럴로 선언할 경우 내부적으로 String의 intern() 메서드가 호출되게 되고 intern() 메서드는 주어진 문자열이 string constant pool에 존재하는지 확인하고 있으면 그 주소값을 반환하고 없으면 string constant pool에 넣고 새로운 주소값을 반환한다.
String a = "aaa"; // 리터럴을 이용한 방식
String b = "aaa"; // 리터럴을 이용한 방식
String c = new String("aaa"); // new 연산자를 이용한 방식
위와 같은 값을 가지는 string a, b, c가 있을 때
[문제] 아래 코드의 답은?
1. a.equals(b);
2. a.equals(c);
3. a == c
[답]
1. true
2. true
3. false
a, b는 리터럴을 이용한 방식으로 만들었기 때문에 둘의 주소값이 같다.
하지만 c는 String c = new String("aaa");
로 만들었기 때문에 a, b와 주소값이 다르다.
따라서 equals()
메소드를 이용하면 a, b, c 모두는 true가 나오게 되지만, ==
를 이용하면 a,b와 c를 비교할 때 false가 나온다.
참고
equals와 ==의 차이점
자바에서 equals()와 ==의 차이
[Java] 문자열 비교하기 == , equals() 의 차이점