의문
위 코드 같이 class를 생성하여 equals 함수를 사용하면 false가 나오게 되는 반면 String은 true가 나오게 된다.
Object간 비교는 내부의 값이 아닌 객체를 가르키는 주소값(정확히는 객체의 해시코드)으로 비교하기 때문으로 알고 있는데 어째서 String은 값 비교가 가능한 것일까?
각 equals 메소드 확인
우선 Object 클래스에 정의된 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로 다시 들어가는데 따라가보자
드디어 실제 값 비교를 하는 부분이 나왔다.
String의 value가 byte[]에 저장 되어 있었고
두개의 byte[]의 값을 하나 하나 비교하여 다른 값이 있을 경우 false 모두 같으면 true를 리턴해준다.
결론
결국 다른 특별한 방법이 있는게 아니라 String의 문자 하나하나를 비교해서 같은지 다른지를 비교하고 있었던 것 뿐이다.
실제로 String 뿐만 아니라 많은 class에서도 equals를 override하여 사용하고 있었다.
이런 java 내에 이미 정의된 class를 보는 것도 많은 공부가 되는 것 같다.!
'개발 이모저모 > 뻘 짓 연구' 카테고리의 다른 글
[Java] String은 특별하다. (0) | 2021.10.22 |
---|---|
[Java] Priority Queue 들여다 보기 (1) | 2021.10.14 |
[JAVA] 이차원 배열의 모든 크기는 일정해야하지 않나? (0) | 2021.09.10 |