본문 바로가기
Language/Java

[Java] equals() 메소드와 == 연산자의 차이

by 키튼햄 2023. 11. 11.

처음 자바를 배웠을때 같은 값을 비교하는데 ==과 equals() 메소드를 강사님이 번갈아 사용하셨다.

그때는 뭣모르고 따라치느라 이 두개의 차이점에 대해 잘 몰랐는데 공부를 하다보니 이런 기본적인 차이점을 아는 것이 중요하다고 생각하여 정리해보고자 한다.


 

 

`equals()` 와 `==`은 자바에서 객체 비교에 사용되는 방법이다.

같은 것인지 비교하는 것에서 공통점이 있지만 분명한 차이점이 존재한다.

 

 

equals() 메소드

equals() 메소드는 Object 클래스에서 상속받은 메소드로, 기본구현은 두 객체의 메모리 주소가 아닌 내용을 비교한다.

문자열(String) 클래스에서는 문자열의 내용을 비교하도록 오버라이딩 되어있기 때문에 간단하게 문자열의 비교를 할 수 있다.

 

String str1 = new String("hello");
String str2 = new String("hello");

System.out.println(str1.equals(str2)); // true (st1과 str2의 내용이 같으므로)

 

 

 

WITH절

== 연산자는 두 객체의 메모리 주소를 비교한다.

즉, 두 객체가 동일한 객체인지 여부를 판단한다.

 

기본 데이터 타입(int, long, float, double, char, boolean 등) 의 경우 값 자체를 비교하고,
참조 데이터 타입(String, Array, Class, Interface, List등)의 경우에는 메모리 주소를 비교한다.

 

String str1 = new String("hello");
String str2 = new String("hello");

System.out.println(str1 == str2); // false (서로 다른 객체이므로)

 

 

 


 

 

 

따라서 문자열(String)을 비교할 때는 equals() 메소드를 사용하는 것이 일반적이다.

두 문자열의 내용이 같은지를 비교하는 것이기 때문이며, 객체 비교를 한다면 다른 결과가 나올 수 있기 때문이다.

 

다만, 기본데이터 타입을 비교하는 경우에는 ==을 사용하여 값을 비교하는 것이 간단하고 효율적이다.

 

 

ex.

문자(char)와 문자열(String)을 비교할때의 차이점.

문자(char)는 기본데이터 타입으로, 내부적으로는 값 자체를 직접 비교할 수 있다.

따라서 `==`을 사용하여 두 문자를 비교하는 것이 효율적이다.

하지만 문자열(String)의 경우에는 다르다. 문자열은 객체로 다뤄지기 때문에 같은 값을 같는 문자열이라도 메모리에 따로 생성될 수 있다. 따라서 문자열의 내용을 비교할 때는 `==`이 아닌 `.equals()` 메소드를 사용하는 것이 안전하다.