String은 왜 불변일까

김건우·2025년 7월 2일

개발 이야기

목록 보기
10/11
post-thumbnail

갑자기 String은 왜?

면접을 준비하면서 이론 공부를 하다 보니 String, StringBuffer, StringBuilder에 대해서 다시 공부하게 되었다.

그러던 중 후배가 "근데 String은 왜 불변일까요 선배?" 라는 질문을 나에게 던졌고 이를 들은 나는 명확한 답변을 못했다.

Java로 개발하고 살면서 String은 불변 객체다 라는 개념에 대해서 '왜?' 라는 질문을 한 번도 던져보지 않았다.

이번 기회에 그래서 String은 '왜' 불변일까 에 대해서 공부하였고, 이를 공유하고자 한다.

불변 객체?

'불변'이란 아닐 불(不), 변할 변(變)으로 변하지 않는다는 뜻이다. 그러나 Java를 써본 사람이라면 아래 코드와 같이 String 변수를 수정할 수 있다는 점을 알고 있을 것이다.

String a = "test";
a = "testtest";

그럼 뭐가 변하지 않는다는 걸까? 일단 먼저 짚고 가야할 부분은 String은 기본형 타입이 아니라 참조형 타입, 즉 String은 클래스이다.

기본형 타입 중 하나인 int는 가변이기에 경우 값을 변경한다고 해도 메모리에 새로운 할당이 발생하지 않는다. 기존에 할당된 공간에 있던 데이터가 변경된다.

반대로 String 같은 참조형 타입이면서 '불변'이기에 아래 이미지처럼 값이 변경될 경우 메모리 내에 새로운 공간을 할당 받게 된다.

그렇기에 우리가 보기에는 가변인 것 같지만 실제로는 매번 메모리에 할당이 발생하고 있기에 실제로 초기에 선언되어 메모리에 할당된 값은 변하지 않는 '불변'한 객체인 것이다.

왜 굳이 이렇게 해?

보안성

String 객체는 보통 비밀번호, 전화번호, 사용자 ID 등 서버에서 다루는 민감한 데이터들을 저장하는데 주로 사용된다. 만약 이때 String이 가변이었다면 코드 상 오류, 해킹 등으로 인해 값들이 변경될 가능성이 존재한다.

이러한 위험을 방지하고 차단하기 위해 불변성을 가지고 있는 것이다.

메모리 효율

String 객체는 String Pool이라는 별도의 메모리 공간에 할당되어서 저장된다. 이때 만약 같은 값을 가지는 객체에 대해서 같은 메모리를 참조할 수 있도록 하여서 메모리의 효율성을 높일 수 있다.

만약 String이 가변이었다면 언제 어떻게 메모리의 값이 변경될지 알 수 없기에 이러한 String pool 형태로 관리가 불가능하다.

동기화

String은 불변이기에 멀티 쓰레드 환경에서 값의 변경이 될 가능성이 없기에 동기화 문제에서 안전하다는 이점이 있다.

마치면서

당연하다고 여기고 있던 이론들도 '왜?' 라는 질문을 한 번씩 던져 보는 것에 중요성을 이번 기회에 알게 되었다. 다들 오늘도 즐거운 코딩 하기를 바란다.

profile
백엔드 개발자, 김건우입니다.

0개의 댓글