[Java] String Class ?!

Carrot.___.·2023년 5월 12일
0

그동안 자주 사용했던 String 클래스에 대해 정리해보고자 한다.

String Class는 immutable(불변) 객체이다.

String str1 = "ABCD";
str1 = "EFG"

해당 객체는 str1이 가리키는 주소에 "EFG"라는 문자열을 할당하는 것처럼 보인다. 하지만, 내부적으로는 "EFG"을 참조하는 것이다.

그리고, String Class는 다음 인터페이스를 구현한 클래스이다.

  • Serializable
    • 해당 객체가 저장되거나, 외부로 전달될 수 있음을 나타낸 인터페이스
      • serialVersionUID를 이용해 해당 객체가 호환되는 객체인지 판단(serialVersionUID를 명시적으로 생성하지 않으면 컴파일러가 자동 생성)
  • Comparable< String >
    • 해당 객체를 비교하는 메소드를 포함한 인터페이스
  • Charsequence
    - Character Sequence에 관한 다향한 메소드 인터페이스(ex : 문자열 길이, 문자열 인덱스 관련, Char Stream 등)

String 생성 방법

String 객체는 다음과 같이 생성할 수 있다.

String str1 = "ABCD";
String str2 = "ABCD";
String str3 = new String("ABCD");

String 비교하기 (==, equals)

  • == 비교

    • String은 Reference Type객체이기 떄문에 == 연산 시, 주소 값 연산을 할 것이다. 하지만, 위 코드에서 str1 == str2은 true값이 반환이 된다. 왜 그럴까?
    • Java는 리터럴로 생성한 문자열을 Constant Pool 영역에 저장된다. 그리고, JVM에서 실행할 때, 해당 문자열이 이미 Constant Pool(Heap영역에 있음)에 있다면, 그 문자열을 할당해준다. 따라서, 두 문자열은 Constant Pool의 같은 문자열을 가르키고 있기 때문에(=동일한 주소값을 갖고 있음) 출력 결과는 true로 나온다.

    • 그렇다면, str1 == str3의 값은 어떻게 될까?
    • 결론적으로 말하자면 출력결과는 false이다.
      new를 통한 String객체는 동적으로 Heap영역에 새로 할당된다. 따라서, 해당 주소는 서로 다르므로, false가 출력되는 것이다.

  • equals()를 통한 비교

    • String도 클래스이므로 Object클래스를 상속받을 것이다.
      String 클래스는 다른 객체들과 다르게 이미 equals() method를 통한 override가 구현되어 있다.

      해당 메소드를 분석해보면, 다음과 같이 세가지의 비교가 수행된다.
      1) 주소값이 같거나
      2) 내부 메소드에 문자열 길이를 비교
      3) 문자열 전체를 비교
      이를 통해, 굳이 사용자가 equals()를 오버라이딩하지 않아도 된다.

      그런데 궁금한점이 하나 생겼다. equals()를 재정의하면 hashcode()도 동등성을 위해 재정의해야 한다는 것은 모두 알고 있을 것이다. 그렇다면, hashcode()는 동일한 값을 반환할까?

      hashCode()는 다음과 같이 구현되어 있다.
      따라서, 문자열이 같다면, value 매개변수는 같을 것이고, 따라서 동일한 값을 반환하게 될 것이다. (같은 인코딩 방식이라는 가정)

0개의 댓글

관련 채용 정보