[JAVA] String이 불변(immutable)인 이유?

2023. 4. 11. 23:12·JAVA
목차
  1. 스트링은 왜 불변(immutable)으로 설계되었을까?
  2. 1. String 객체의 캐싱 기능과 성능
  3. 2. 보안
  4. 3. 안전성
반응형

스트링은 왜 불변(immutable)으로 설계되었을까?

기본적으로 자바에서는 String 객체의 값은 변경할 수 없다.

그렇다면 왜 String은 불변하게 만들었을까?

String이 불변인 이유는 크게 3가지로 볼 수 있다.

 


1. String 객체의 캐싱 기능과 성능

문자열 객체는 널리 사용되고 재사용될 가능성이 매우 높다. JAVA는 String 리터럴을 캐싱하고 재사용해 많은 힙공간을 절약할 수 있다. 예를 들어 아래같은 코드를 실행했을 때

ex 1) 

String str1 = new String("hello");
String str2 = new String("hello");

 

 

메모리상에 2개의 인스턴스가 생성되게 된다. 하지만 리터럴 방식을 이용하면  Heap의 String pool이라는 공간에 String 을 저장해 실제로는 2개의 문자열 객체를 생성하는 것이 아닌 1개의 "hello" 라는 문자열을 pool안에 생성하고 이 문자열을 참조하도록 한다.

 

ex 2)

String s1 = "Cat";
String s2 = "Cat";
String s3 = new String("Cat");

Heap 내부동작

2번째 예시에서도 보다시피 변수s2의 값이 새로 생성되는 것이 아닌 String pool에 이미 생성된 "Cat"을 참조하는 것을 볼 수 있다.

이 과정을 통해 메모리를 아낄 수 있어 특정 문자열 값을 재사용하는 빈도가 높을수록 성능 향상을 기대할 수 있다.

new 연산자로 생성하면 같은 내용이라도 여러 인스턴스가 heap영역에 생성된다.

 


2. 보안

JAVA에서는 아래와 같이 파라미터로 문자열을 넘길 경우가 자주 발생하는데

 

  • DB연결을 위한 URL 패스워드 연결
  • 네트워크 연결을 위한 host, port
  • 이름, 나이 등등의 정보

String이 불변하지 않았다면 해커들의 악의적 공격에 의해 값이 변경되거나 잘못된 설계로 값이 변경된다면 어플리케이션에 심각한 보안적 취약점이 발생할 수 있다.

 


3. 안전성

String 객체는 변경할 수 없기 때문에, 여러 스레드에서 동시에 특정 String에 접근할 때 안정성을 보장할 수 있다.

또한 스레드가 값을 변경하는 작업을 실행한다 해도 값이 수정되는 것이 아닌 String pool에 새로운 문자열이 생성되기 때문에 Multi - Thread 환경에서도 안전하게 사용할 수 있다.

 


 

+ hashcode 캐싱

String 객체는 데이터 구조로 많이 사용되기 때문에 HashMap , HashTable , HashSet 등과 같은 해시 구현에서도 널리 사용됩니다 . hashCode () 메서드는 캐싱을 용이하게 하기 위해 String 클래스 에서 재정의 되어 첫 번째 hashCode() 호출 중에 해시가 계산 및 캐시되고 그 이후로 동일한 값이 반환됩니다. 이를 통해 컬렉션의 성능을  향상시킬 수 있다.

 

참고

https://www.baeldung.com/java-string-immutable

반응형

'JAVA' 카테고리의 다른 글

[JAVA] 래퍼 클래스(Wrapper Class)란?  (0) 2024.05.31
[JAVA] ENUM 이란?  (0) 2024.05.28
[JAVA] JVM(Java Virtual Machine)  (0) 2023.07.11
[JAVA]String, StringBuilder, StringBuffer  (0) 2023.04.08
[JAVA] 인터페이스  (1) 2022.11.23
  1. 스트링은 왜 불변(immutable)으로 설계되었을까?
  2. 1. String 객체의 캐싱 기능과 성능
  3. 2. 보안
  4. 3. 안전성
'JAVA' 카테고리의 다른 글
  • [JAVA] ENUM 이란?
  • [JAVA] JVM(Java Virtual Machine)
  • [JAVA]String, StringBuilder, StringBuffer
  • [JAVA] 인터페이스
여포개발자
여포개발자
여포개발자
어제보다 오늘 더
여포개발자
전체
오늘
어제
  • 분류 전체보기 (141)
    • Backend (41)
      • 프로젝트 (18)
      • MSA 전환 (10)
      • spring (6)
      • JPA (7)
    • JAVA (11)
    • Kotlin 정리 (11)
    • 알고리즘 (59)
      • 프로그래머스 LV0 (5)
      • 프로그래머스 LV1 (12)
      • 프로그래머스 LV2 (17)
      • 프로그래머스 LV3 (8)
      • 백준 (14)
      • 소프티어 (3)
    • 네트워크 (3)
    • Docker (3)
    • SQL (5)
    • Kafka (6)
    • 일상 (1)
    • .NET (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Kotiln
  • #JAVA #프로그래머스 #LV1
  • 네트워크
  • #프로그래머스 #자바
  • HTTP
  • 모니터링
  • docker
  • #JAVA #프로그래머스
  • 프로그래머스
  • 프로젝트
  • #JPA #JAVA
  • Spring
  • 프로그래머스LV1
  • 티스토리챌린지
  • #JAVA #프로그래머스 #LV1 #모두화이팅
  • Kotlin
  • 자바 #백준
  • JPA
  • JAVA #프로그래머스 #LV0
  • 오블완
  • docker #MySQL
  • 백준
  • #프로그래머스
  • java
  • MSA
  • TroubleShooting #JPA

최근 댓글

최근 글

반응형
hELLO· Designed By정상우.v4.5.2
여포개발자
[JAVA] String이 불변(immutable)인 이유?
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.