본문 바로가기
Java

[Java] == vs. equals()

by 왕타오 2023. 11. 22.

자바에서 두 객체 혹은 변수를 비교할 때  == 연산자 또는 equals() 메소드를 사용한다.

 

int 와 boolean과 같은 기본 원시 타입(Primitive Type)의 비교는 == 연산자를 사용하여 비교한다. 

String 또는 클래스와 같이 참조 타입(Reference Type)의 비교는 == 연산자 또는 equals() 메소드를 사용하여 비교할 수 있다.

 

== 연산자(주소 값 비교), 값 비교(equals) 

== 연산자와 equals() 메소드의 가장 큰 차이점은 == 연산자는 비교하고자 하는 두 대상의 주소 값을 비교하고,

equals0 메소드는 비교하고자 하는 두개의 대상의 값 자체를 비교한다는 것이다.

 

문자열 비교

 

equals()

equals() 메소드는 최상위 클래스인 Object에 포함되어 있기 때문에 모든 하위 클래스에서 재정의하여 사용할 수 있다.

따라서 어떻게 재정의 하는지에 따라 원하는 기준으로 비교가 가능하다.

 

String 클래스에서 equals()는 문자열의 내용이 같으면 true를 리턴하도록 재정의 되어있다.

 

문자열을 하나씩 모두 비교해서 동일하면 true를 리턴한다. 따라서 서로 다른 객체라도 같은 문자열을 가지고 있으면 동일하다고 판단한다.

 

그렇다면 새로 작성한 클래스의 객체에 동일한 값을 넣어 생성해본다고 가정하자.

이 두 객체를 비교했을때 같다고 나올까? 

 

아래 예제를 보자, Book이라는 클래스에 book1 이라는 동일한 이름으로 생성하였다.

하지만 String 클래스의 비교와 다르게 equals() 메소드를 사용했을때 서로 다르다고 나온다.

 

객체 book1 이 참조하는 equals() 메소드를 확인해보자. 

 

객체 book1 이 참조하는 equals() 메소드는 비교하려는 두 대상의 주소 값을 비교하여 boolean 값을 리턴한다. 

book1, book2 객체는 Heap 메모리 영역에 각각 저장되어있으므로 해당 객체가 참조하는 주소 값 또한 다르다.