뜌릅

📌 == 와 equals의 차이점은 무엇입니까? 본문

SPRING/주니어 자바 개발자를 위한 100가지 질문

📌 == 와 equals의 차이점은 무엇입니까?

TwoCastle9 2023. 6. 22. 14:25
반응형

https://careerly.co.kr/comments/83898

 

조서희 / 주니어 자바 개발자를 위한 100가지 질문 1 | 커리어리

"주니어 자바 개발자를 위한 100가지 질문" 1편입니다. 주니어 자바 개발자를 위한 100가지 질문 (2)...

careerly.co.kr

 

나는 자바보다는 코틀린을 기반으로 스프링 코드를 짜고 있다.

우선 자바의 equals와 ==의 차이를 간단하게 살펴보니, ==는 객체의 값(근데 객체는 값으로 주소값을 갖고있으므로 사실 주소값 비교이다.), equals는 메소드가 비교하고자 하는 객체의 값을 비교하게 되는 것이다.

그렇다면 kotlin에서는 어떨까? (코틀린은 자바와는 다르게 작동한다.)
kotlin에는 ==, ===, equals가 존재한다.

String타입과 data class로 만든 타입으로 비교를 해보았다.

 

먼저 String타입부터 살펴보자.


Kotlin에서 ==는 동등성 비교, 즉 값을 비교하는 녀석이다. 이놈은 내부적으로 equals을 호출해서 작동하므로 == 연산자와 equals의 결과값은 같다. 

=== 연산자의 경우는 동일성 비교로 객체의 값이 아닌 내부 주소를 비교하고 싶을 때 사용한다. 

 

위의 사진에서 str1과 str2을 ==(equals)을 하게 되면 내부의 값을 비교하게 되므로 str1과 str2의 값은 true가 나오게 된다. 하지만 이상한점이 있을 텐데, str1 === str2도 true가 나왔다는 것이다. 이 경우에는 String 타입의 특징이라고 볼 수 있다. Kotlin(JVM기반 언어의 특징인지 Kotlin만의 특징인지는 모르겠다.)에서는 메모리 절약을 위해 동일한 String의 값이 이미 저장되어 있다면 String 타입의 변수는 같은 메모리 주소를 Reference한게 된다. 결과적으로 str1 === str2도 true가 나오게 되는 것이다.

 

Custom Class 타입 객체 비교의 경우


hashCode()함수는 일단 신경쓰지 말자.

위와 같이 생긴 클래스 타입이 있다고 해보자. equals는 Class 내부의 Property인 name과 brand의 값들을 비교하는 함수로 구현하였다. 아까의 String타입같이 값들을 비교해보자. 

결과는 위와 같다.

내부값이 같은 car1과 car2의 경우 동등성 비교에서는 true가 나왔지만, 동일성 비교인 ===에서는 false가 나왔다. 

car3의 경우는 내부값과 주소값 모두 car1과 다르므로 false가 나왔다. 

 

equals의 함수를 다음과 같이 바꾸게 되면

위의 사진처럼 결과값이 바뀌게 된다.
감사합니다!

반응형