의문

위 코드 같이 class를 생성하여 equals 함수를 사용하면 false가 나오게 되는 반면 String은 true가 나오게 된다.

 

Object간 비교는 내부의 값이 아닌 객체를 가르키는 주소값(정확히는 객체의 해시코드)으로 비교하기 때문으로 알고 있는데 어째서 String은 값 비교가 가능한 것일까?

각 equals 메소드 확인

object 클래스에 정의된 equals method

우선 Object 클래스에 정의된 equals method를 확인하게 되면

단순히 == 연산자를 이용한 비교로 주소값 비교가 되는 것을 확인 할 수 있다.

 

String 클래스에 정의된 equals method

그런데 String 클래스 내부의 equals 함수를 따라가 보면

Object class의 equals 함수를 override하여 재정의 한 모습을 볼 수 있다.

 

즉 String만 특별취급을 받아서 객체임에도 값으로 취급 받는 것이 아닌 override를 통해 값 비교가 가능하게 만든 것.

 

 

조금 더 봐보자

코드를 조금더 살펴보면

먼저 주소값 비교를 통해 완전히 같은 객체라면 바로 true를 리턴한다.

 

그리고 기존에 Java 8 에선

단순히 char[]로 바꾸어 두개의 String을 문자 하나하나 비교했었는데

 

현재 Java 16에선 무엇인가 추가 되어있다.

 

COMPACT_STRINGS 는

char[] 가 아닌 byte[]로 저장하기 위한 장치인 것 같은데

아래 블로그에 잘 정리 되어 있으니 확인해보자

https://m.blog.naver.com/gngh0101/221562878280

 

자바11 Compact Strings 에 대해서 쉽게 이해하기 (vs Compressed, Performance Test)

자바11 Compact Strings 에 대해서 쉽게 이해하기 (vs Compressed, Performance Test) Java 9 부터 ...

blog.naver.com

 

이외 StringLatin1.equals로 다시 들어가는데 따라가보자

StringLatin1에 정의된 equals

 

드디어 실제 값 비교를 하는 부분이 나왔다.

String의 value가 byte[]에 저장 되어 있었고

 

두개의 byte[]의 값을 하나 하나 비교하여 다른 값이 있을 경우 false 모두 같으면 true를 리턴해준다.

 

결론

결국 다른 특별한 방법이 있는게 아니라 String의 문자 하나하나를 비교해서 같은지 다른지를 비교하고 있었던 것 뿐이다.

 

실제로 String 뿐만 아니라 많은 class에서도 equals를 override하여 사용하고 있었다.

x,y 값을 가지는 Point class에 정의된 equals

 

이런 java 내에 이미 정의된 class를 보는 것도 많은 공부가 되는 것 같다.!

+ Recent posts