그동안 자주 사용했던 String 클래스에 대해 정리해보고자 한다.
String str1 = "ABCD";
str1 = "EFG"
해당 객체는 str1이 가리키는 주소에 "EFG"라는 문자열을 할당하는 것처럼 보인다. 하지만, 내부적으로는 "EFG"을 참조하는 것이다.
그리고, String Class는 다음 인터페이스를 구현한 클래스이다.
String 객체는 다음과 같이 생성할 수 있다.
String str1 = "ABCD";
String str2 = "ABCD";
String str3 = new String("ABCD");
== 비교
equals()를 통한 비교
String도 클래스이므로 Object클래스를 상속받을 것이다.
String 클래스는 다른 객체들과 다르게 이미 equals() method를 통한 override가 구현되어 있다.
해당 메소드를 분석해보면, 다음과 같이 세가지의 비교가 수행된다.
1) 주소값이 같거나
2) 내부 메소드에 문자열 길이를 비교
3) 문자열 전체를 비교
이를 통해, 굳이 사용자가 equals()를 오버라이딩하지 않아도 된다.
그런데 궁금한점이 하나 생겼다. equals()를 재정의하면 hashcode()도 동등성을 위해 재정의해야 한다는 것은 모두 알고 있을 것이다. 그렇다면, hashcode()는 동일한 값을 반환할까?
hashCode()는 다음과 같이 구현되어 있다.
따라서, 문자열이 같다면, value 매개변수는 같을 것이고, 따라서 동일한 값을 반환하게 될 것이다. (같은 인코딩 방식이라는 가정)