Java에서 == 연산자와 equals() 메소드는 모두 두 변수나 객체가 같은지를 비교하는 데 사용됩니다. 하지만 두 방식은 비교하는 기준이 완전히 다르기 때문에, 그 차이를 정확히 이해하는 것이 매우 중요합니다.
아래 표는 ==와 equals() 메소드의 주요 차이점을 정리한 것입니다.
| 번호 | 구분 | == | equals() 메소드 |
|---|---|---|---|
| 1 | 종류 | ==는 연산자(operator)입니다. | equals()는 Object 클래스에 정의된 메소드입니다. |
| 2 | 비교 대상 | 참조(reference) 비교에 사용됩니다. 두 참조 변수가 동일한 메모리 위치(같은 객체)를 가리키는지 확인합니다. | 내용(content) 비교에 사용됩니다. 객체가 담고 있는 실제 값을 평가하여 동등성을 판단합니다. |
| 3 | 재정의 가능 여부 | == 연산자는 재정의(오버라이딩)할 수 없습니다. | equals() 메소드는 별도로 정의되어 있지 않으면 Object 클래스의 기본 구현을 사용하며, 필요에 따라 재정의할 수 있습니다. |
== vs equals() 예제 코드
다음 예제를 통해 두 방식의 차이를 직접 확인해 보겠습니다.
JavaTester.java
public class JavaTester {
public static void main(String args[]) {
String s1 = new String("TUTORIALSPOINT");
String s2 = new String("TUTORIALSPOINT");
// 참조 비교 - 서로 다른 객체이므로 false
System.out.println(s1 == s2);
// 내용 비교 - 문자열 내용이 같으므로 true
System.out.println(s1.equals(s2));
// int 타입 비교
System.out.println(10 == 10);
// char 타입 비교
System.out.println('a' == 'a');
}
}실행 결과
false true true true
결과 분석
s1 == s2가 false를 반환하는 이유는, new String()으로 생성된 두 문자열은 내용은 같지만 서로 다른 메모리 위치에 존재하는 별개의 객체이기 때문입니다. 반면 s1.equals(s2)는 문자열의 실제 내용을 비교하므로 true를 반환합니다.
기본형(primitive type)인 int나 char의 경우 값 자체가 저장되므로 ==로 비교해도 원하는 결과를 얻을 수 있습니다.
정리
- 객체의 참조(주소)를 비교할 때는
==를 사용합니다. - 객체의 내용(값)을 비교할 때는
equals()를 사용합니다. - 특히 String과 같은 참조형 데이터를 비교할 때는 의도치 않은 버그를 피하기 위해
equals()사용을 권장합니다.