정처기 감자정처기 감자
Java배열/문자열

검색

검색어를 입력해 개념, 문제, 필기를 찾습니다.

String 불변성과 StringBuilder

코딩Java문자열
읽는데 8분 소요
처음 쓰인 날: 2026-05-19
마지막 수정일: 2026-10-03
조회수: —
선수학습(1개)
  • 문자열의 기초

요약

Java의 String은 한 번 만들면 내용을 바꿀 수 없는 불변(immutable) 객체입니다. 반복문에서 + 연산으로 문자열을 누적하면 매번 새 객체가 생기는 성능 함정을, 가변 버퍼인 StringBuilder의 append()로 어떻게 해결하는지 정리합니다.

이 페이지는 기출 출제 이력이 없는 보충 페이지입니다
StringBuilder와 String 불변성은 현재까지 정처기 실기 기출에 등장한 적이 없는 주제입니다. 핵심 기출 범위만 공부하고 싶다면 이 페이지는 건너뛰어도 됩니다. 최근 회차의 출제 범위가 점점 넓어지고 있어 어디서 나올지 예측하기 어렵기 때문에, 혹시 모를 출제에 대비해 추가한 페이지입니다.

핵심 정리

개념설명
String불변(immutable) 객체. 변수가 섞인 실행 중 연결은 새 객체를 생성
StringBuilder가변(mutable) 문자열 버퍼. 같은 객체에 누적
반복 + 연결String은 매 반복마다 새 객체, StringBuilder는 객체 1개 유지
주요 메서드append, insert, delete, reverse, toString

여기서 객체는 '메모리에 만들어진 데이터 덩어리'라고 생각하면 됩니다. 자세한 의미는 객체와 클래스에서 다룹니다.


String 불변성

Java의 String은 불변(immutable) 객체입니다. 한 번 만들어진 문자열 객체의 내용은 절대 바뀌지 않습니다.

변수 s는 객체 그 자체가 아니라 '객체가 저장된 위치(주소)'를 들고 있는 종이쪽지입니다. 종이에 적힌 주소가 바뀔 수는 있지만, 그 주소가 가리키는 객체의 내용물 자체는 바뀌지 않습니다. 이 차이가 '불변'의 핵심입니다. str = str + "A" 처럼 변수가 섞인 연결은 실행 중에 계산되므로, 기존 객체를 수정하는 것이 아니라 새 문자열 객체를 만들어 참조만 바꿉니다. 변수 s가 가리키는 객체가 새 객체로 갈아끼워질 뿐, 옛 객체 자체의 내용이 바뀐 적은 없습니다. 이걸 '객체는 불변'이라고 합니다.

java
코드 하이라이팅 중…

단, String에 관한 모든 대입이 새 객체를 만드는 것은 아닙니다.

코드새 객체 생성동작
String t = s;X참조 대입. s의 주소만 복사하므로 s == t는 true
t = "xyz";X리터럴 재할당. 풀이 공유하는 리터럴 객체로 참조만 바꿈
t = s + "B";O변수가 섞인 실행 중 연결. 새 String 객체를 만듦
t = "A" + "B";X상수끼리의 연결은 컴파일 때 "AB"로 계산되어 리터럴 "AB"와 같은 객체를 공유
단계메모리 상태참조
String s = "Hello";"Hello" 객체 1개s → "Hello"
s = s + " World";"Hello", "Hello World" 객체 2개s → "Hello World"
String 불변성 — s + World 실행 후 s의 참조만 새 객체로 바뀌고 Hello 객체 내용은 그대로
s + ' World'는 기존 객체를 수정하는 게 아니라 실행 중 연결로 새 객체(주소 200)를 만들어 s의 참조만 바꿉니다. 리터럴 'Hello' 객체(주소 100)의 내용은 그대로입니다.

원래의 "Hello" 객체는 내용이 바뀌지 않은 채 그대로 남습니다. 더 이상 쓰이지 않는 객체는 Garbage Collector1가 알아서 정리하므로, 시험에서는 '객체 내용은 바뀌지 않고 참조만 바뀐다'는 점만 기억하면 됩니다.

반복 연결의 비용

변수 result를 반복해서 이어 붙이면 실행 중 연결이므로, 매 반복마다 새로운 String 객체가 하나씩 생깁니다. 1000번 반복하면 약 1000개의 String 객체가 만들어지고, 매번 기존 문자열을 새 객체로 복사하므로 반복 횟수가 커질수록 처리 시간이 급격히 늘어납니다.

java
코드 하이라이팅 중…
반복내부 동작
1회차"" + "x" → "x" 객체 생성
2회차"x" + "x" → "xx" 객체 생성 (이전 "x" 객체는 더 이상 result가 가리키지 않음)
3회차"xx" + "x" → "xxx" 객체 생성
...반복마다 새 객체 누적
String += 반복의 누적 비용 — 매 반복마다 실행 중 연결로 새 객체 생성
매 반복마다 실행 중 연결로 새 객체가 만들어지고, 이전 중간 객체(회색)는 더 이상 result가 가리키지 않습니다. 1000회 반복이면 약 1000개의 String 객체가 만들어져 성능과 메모리에 부담을 줍니다.

StringBuilder — 가변 문자열

StringBuilder 는 내용을 수정할 수 있는(가변) 문자열 버퍼입니다. append()로 문자를 덧붙여도 객체가 새로 만들어지지 않고 같은 객체의 내부 배열2에 덧붙습니다.

java
코드 하이라이팅 중…
StringBuilder — 같은 객체의 내부 배열에 누적
반복해도 sb가 가리키는 주소는 100으로 고정됩니다. 새 객체를 만들지 않고 같은 객체의 내부 배열만 자라납니다. 1000회 반복해도 객체는 1개.

String vs StringBuilder 비교

구분StringStringBuilder
가변성불변 (immutable)가변 (mutable)
반복 연결 객체 수반복마다 새 객체같은 객체 유지
주요 메서드+, concat()append(), insert(), delete(), reverse()
속도 (반복 연결)느림빠름
용도문자열이 거의 바뀌지 않을 때반복 수정이 필요할 때

참조 동일성 차이

StringBuilder는 객체가 바뀌지 않으므로 append() 전후의 참조가 동일합니다. 반면 String은 아래처럼 변수가 섞인 실행 중 연결을 하면 새 객체가 생기므로 참조가 바뀝니다.

java
코드 하이라이팅 중…

==는 두 변수가 같은 주소를 가리키는지 비교합니다. 내용이 같아도 다른 주소면 false가 됩니다. 내용 비교는 equals()로 따로 해야 합니다.

StringBuilder는 같은 객체 공유, String은 새 객체로 분리
StringBuilder는 같은 객체(주소 100)를 공유하므로 == 결과가 true. String은 참조 대입 직후 두 변수가 같은 객체(주소 200)를 공유하지만, 실행 중 연결 뒤에는 연결한 변수만 새 객체(주소 300)를 가리켜 == 결과가 false. (그림의 변수명은 아래 연습 문제 코드 기준)

StringBuilder 주요 메서드

java
코드 하이라이팅 중…

시작값 "Hello"를 기준으로 각 메서드를 단독 호출했을 때의 결과입니다.

메서드동작예시결과
append(x)끝에 덧붙임sb.append("W")"HelloW"
insert(i, x)i번 자리에 삽입sb.insert(0, "A")"AHello"
delete(a, b)a ~ b-1 범위 삭제sb.delete(1, 2)"Hllo"
reverse()문자열 뒤집기sb.reverse()"olleH"
toString()String으로 변환sb.toString()"Hello"
length()현재 길이sb.length()5

insert와 delete는 인덱스를 어떻게 다루는지 그림으로 보면 이해가 쉽습니다.

StringBuilder의 insert / delete 인덱스 동작
insert(i, x)는 인덱스 i 자리에 글자를 끼워 넣고 뒤 글자를 한 칸씩 밀어냅니다. delete(a, b)는 인덱스 a부터 b-1까지 삭제합니다(끝 인덱스 b는 포함하지 않는 반열린 구간).

연습 문제

문제를 불러오는 중이에요.
문제를 불러오는 중이에요.

Footnotes

  1. Garbage Collector(GC): Java가 더 이상 도달할 수 없는 객체를 자동으로 메모리에서 해제해주는 기능. C언어의 free()처럼 직접 해제 함수를 호출할 필요가 없음. ↩

  2. StringBuilder는 내부에 글자를 담는 배열을 들고 있고, append 시 그 배열의 빈 칸에 글자를 채워 넣습니다. 자리가 부족해지면 더 큰 배열로 한 번 옮겨 담습니다. ↩


메가커피와 함께, 홈페이지 개선에 참여하세요! ☕
혹시 이용에 불편한 점이나 개선이 필요한 부분을 발견하셨나요? 댓글로 알려주시면 더 나은 감자가 될 수 있어요! 🥔 제보해주신 모든 분께 메가커피 기프티콘을 드립니다! (본인 이메일로 댓글 달아주셔야해요~)
후수학습(1개)
  • Java 기본 제공 클래스 (Integer, Math)
정처기 감자정처기 감자

정보처리기사 합격
도와줄라고 하는 감자

실기 이론

  • 이론 공부법
  • DB
  • 네트워크/OS
  • SW 설계
  • SW 개발
  • 보안/신기술

시험 응시

  • 시험장 찾기
  • 원서 접수
  • 응시자격 서류

요약 PDF

  • 26년 3회 이론 압축
  • 26년 3회 코딩 압축
  • 초압축 25년 3회
  • 압축 25년 3회

기출문제

  • 전체 기출문제
  • 25년 3회
  • 25년 2회
  • 문제 포럼

감자 이용권

  • 이용권 구매

실기 이론

  • 이론 공부법
  • DB
  • 네트워크/OS
  • SW 설계
  • SW 개발
  • 보안/신기술

시험 응시

  • 시험장 찾기
  • 원서 접수
  • 응시자격 서류

요약 PDF

  • 26년 3회 이론 압축
  • 26년 3회 코딩 압축
  • 초압축 25년 3회
  • 압축 25년 3회

기출문제

  • 전체 기출문제
  • 25년 3회
  • 25년 2회
  • 문제 포럼

감자 이용권

  • 이용권 구매
© 2025 재현기획개발. All rights reserved.
  • 정처기 감자의 시작
  • 업데이트 로그
  • 개인정보 처리방침
  • 이용약관
상호명 : 재현기획개발 / 주소: 서울특별시 영등포구 영등포로 150, 지하1층 108호 L145 가라지(당산동1가, 생각공장 당산) / 대표: 김재현 / 전화: 010-8158-7127 / 통신판매업신고: 제2025-서울영등포-1569호 / 이메일: contact@edugamja.com / 사업자등록번호: 573-51-00999