[Java] String은 불변성 객체이다

Kim Hyen Su·2024년 6월 5일
0

📐Java

목록 보기
14/18
post-thumbnail

String

자바에서 String 객체는 불변성이라는 특징을 갖습니다. 그렇다면, 자바에서 왜 String은 불변성 객체이어야만 하는지에 대해 알아보기 위해 해당 포스팅을 작성했습니다.

📜 참고 블로그

☕ String is immutable

  • 불변성의 의미는 변하지 않는 성질을 의미합니다.
  • 즉, 한번 생성된 객체의 값이 변하지 않습니다.
  • 예제 코드
/**
 * String 불변성 TEST
 */
public class StringImmutableTest {
    public static void main(String[] args) {
        String str1 = "ab";
        String str2 = "ab" + "c";

        // c라는 문자열을 추가만 했을뿐인데, str1의 주소값이 바뀔까?
        System.out.println(System.identityHashCode(str1));
        System.out.println(System.identityHashCode(str2));
    }
}

/* 결과 */
925858445
798154996
  • 위 코드를 그림으로 나타내면, 다음과 같습니다.

  • 즉, 기존의 "ab" 라는 문자열에서 "c"가 추가하더라도, 기존의 "ab"는 그대로 저장되어 있고, "abc"라는 새로운 String 상수가 생성된 것을 알 수 있습니다.

☕ 왜 String 객체는 Java에서 불변성을 갖을까?

  1. ClassLoader : 자바는 String 객체를 매개변수로 사용합니다. 따라서, String 값이 가변성을 갖게될 경우, 로딩될 클래스 내부 값이 달라질 수 있게 됩니다. 이러한 오류를 방지하기 위해서 자바 String 객체는 불변성을 갖습니다.

  2. Thread Safe : String 객체는 불변성을 갖기 때문에, 멀티 쓰레드로 String 객체를 공유 시 동기화를 신경쓰지 않아도 됩니다.

  3. Security : String 객체는 클래스 로딩 시 올바른 클래스를 로딩함으로써 발생할 수 있는 오류들을 예방할 수 있습니다. 은행 같은 경우에, 사용자명과 비밀번호를 외부로 부터 수정되는 것을 막을 수 있습니다. 이는 String 은 불변성 객체이므로, 값을 변경하더라도 해당 값을 참조하는 것이 아니면, 기존의 값을 참조하기 때문입니다.

  4. Heap Space : String 객체의 불변성은 heap 메모리를 최소로 사용할 수 있도록 도와줍니다. 개발자가 새로운 String 객체를 선언할 때, JVM에서는 String Constant Pool에 해당 String Literal이 존재하는지 확인 후 존재할 경우, 해당 객체의 참조값을 반환합니다. 이로 인해서 Heap 메모리를 효과적으로 사용할 수 있도록 해줍니다.

☕ 왜 String class는 Java에서 final로 선언되어 있는가?

  • 이는 외부에서 Stirng 클래스의 메서드를 override할 수 없도록 하기 위함입니다.
  • 즉, String 객체는 항상 동일한 기능을 제공함을 보장하는 것입니다.
profile
백엔드 서버 엔지니어

0개의 댓글