본문 바로가기
JAVA

== 과 equal 의 차이

by 스노위13 2023. 12. 8.

== 연산자와 equals() 메서드의 차이를 명확하게 말로 설명하기 위해 작성해 봄

1. == 연산자
== 연산자는 기본적으로 두 객체의 참조(메모리 주소)를 비교한다.
두 객체가 동일한 메모리 위치를 가리키는 경우에만 true를 반환하고, 그렇지 않으면 false를 반환함.
기본 데이터 타입(예: 정수, 실수)의 경우에는 값 비교가 이루어진다.

1
2
3
4
5
6
7
String str1 = new String("Hello");
String str2 = new String("Hello");
String str3 = str1;
String str4 = "Hello";
String str5 = "Hello";
 
System.out.println(str1 == str2); // false (다른 메모리 위치)
System.out.println(str1 == str3); // true (동일한 메모리 위치)
System.out.println(str4 == str5); // true (동일한 메모리 위치)
 
cs

위에서 str1와 str2는은 new로 생성하였기 때문에 Heap 영역에 각각 다른 메모리주소로 새롭게 생성된다.
그렇기에 두 개를 ==으로 비교하였을 때 메모리 위치가 달라서 false가 뜨게 된다.
하지만  str3은 str1의 메모리주소를 참조하도록 만들어졌기 때문에 ==으로 비교했을 때 true가 뜬다
여기에서 주의할 점은 str4와 str5는 리터럴을 이용한 방식으로 만들어졌기 때문에 String pool이라는 영역에 생성된다.
str4가 먼저 "Hello"를 String pool 안에 생성하고 str5는 String pool에 이미 "Hello"가 있기 때문에 그 값을 참조하게 된다.
그렇기에 str4와 str5를 ==으로 비교하였을 때 true가 뜨게 되는 것이다. 

2. equals() 메서드
equals() 메서드는 객체의 참조(메모리 주소)가 아닌 내용(값) 자체를 비교한다.

1
2
3
4
5
String str1 = new String("Hello");
String str2 = new String("Hello");
String str3 = "Hello";
 
System.out.println(str1.equals(str2)); // true (내용이 동일)
System.out.println(str1.equals(str3)); // true (내용이 동일)
 
cs

그렇기에 str1과 str2를 비교해도 true가 뜨고 str1과 str3을 비교해도 true가 뜬다. 
참조값을 비교하고 싶으면 == 을 사용하고 값 자체를 비교하고 싶다면 equal을 사용해야겠다.

댓글