본문 바로가기

Java & Spring/Java

문자열 불변 객체(Immutable)와 가변 객체(Mutable)의 차이점

728x90

1. String 불변객체 (Immutable Object)

  • 불변(Immutable): 한 번 생성된 객체의 상태(값)가 변경되지 않는 객체
  • Java String 클래스가 대표적인 불변객체

특징

  • String 객체는 한 번 생성되면 내부에 저장된 문자(char 배열)가 바뀌지 않음
  • 문자열을 변경하는 연산(예: concat, replace 등)을 하면 실제로는 새로운 String 객체가 만들어짐
  • 불변성 때문에 여러 스레드에서 안전하게 공유 가능(스레드 안정성)
  • 메모리 관리와 최적화에 유리 (String Pool 활용)

예시

String s1 = "hello";
String s2 = s1.concat(" world");  // 새로운 객체 생성, s1은 변경되지 않음
 

2. String 가변객체 (Mutable Object)

  • 가변(Mutable): 객체 생성 후 내부 상태를 변경할 수 있는 객체
  • Java에서는 대표적으로 StringBuilder, StringBuffer가 있음

특징

  • 문자열을 변경할 때 새로운 객체를 생성하지 않고 내부 버퍼를 직접 수정
  • 성능상 이점 (특히 문자열을 자주 수정할 때)
  • StringBuffer는 동기화(Synchronized) 지원해서 멀티스레드 환경에 안전
  • StringBuilder는 동기화 안 해서 단일 스레드 환경에서 더 빠름

예시

 

StringBuilder sb = new StringBuilder("hello");
sb.append(" world");  // 기존 객체 내부가 변경됨

요약 표

구분 불변 객체(Immutable) 가변 객체(Mutable)
대표 클래스 String StringBuilder, StringBuffer
상태 변경 시 새로운 객체 생성 기존 객체 내부 변경
멀티스레드 안정성 기본적으로 안전 StringBuffer는 안전, StringBuilder는 비안전
성능 변경 많으면 비효율적 문자열 변경 작업에 효율적

 

String 불변객체와 힙(Heap) 영역 관련 핵심 정리

  • String 객체는 힙 영역에 저장된다.
    실제로 String 객체는 힙(heap) 영역에 생성되고, 내부에는 문자(char 배열)가 저장돼 있어.
  • 불변객체라서 ‘내부 문자 배열’이 바뀌지 않는다.
    즉, 생성된 String 객체의 문자 배열은 바뀌지 않고 그대로 유지돼.
  • 참조 변수는 힙에 있는 String 객체의 주소값(참조값)을 가진다.
    예를 들어,여기서 s는 스택(stack)에 저장된 참조 변수이고, 실제 문자열 "hello"는 힙 영역에 저장된 String 객체 내부에 있다.
String s = "hello";
  • 새로운 문자열 연산이 일어나면 기존 문자열을 변경하는 게 아니라, 새로운 힙 영역에 다른 String 객체가 만들어지고 참조 변수가 새 객체를 가리킨다.이때는 새로운 String 객체가 힙에 생성되고, s는 새 객체를 참조하게 됨.
s = s + " world";

핵심

  • 불변객체는 기존 힙 영역의 값을 직접 변경하지 않고
  • 참조 변수는 힙 영역에 저장된 객체(문자열 데이터)의 주소를 가리키는 것 뿐임.
728x90