Java에서 String += 사용 시 메모리 초과가 나는 이유

no-glass-otacku·2025년 3월 30일
0

Algorithm

목록 보기
1/4

Java에서 String += 사용 시 메모리 초과가 나는 이유

🔗 문제 링크: 백준 1874번 - 스택 수열
이 글은 해당 문제를 풀면서 발생한 메모리 초과 이슈를 해결하며 정리한 기록입니다.

알고리즘 문제를 풀던 중, 단순히 문자열을 이어붙였을 뿐인데 메모리 초과(Memory Limit Exceeded)가 발생했다.
이유가 궁금해서 원인을 분석해보고, 어떻게 해결했는지를 정리해두려고 한다.


📌 문자열 반복 연결 시 String vs StringBuilder

🧪 문제 상황

반복문 안에서 String +=을 사용했더니 ➤ 메모리 초과 발생

🧨 원인 분석

  • String불변 객체 (Immutable)
    += 할 때마다 새로운 문자열 객체가 생성됨
  • 반복할수록 메모리에 문자열 객체가 쌓이고
    ➤ GC(Garbage Collector)가 바로 처리하지 못하면 메모리 폭발
  • 실행 시간은 크게 차이 없을 수도 있지만, 메모리 사용량이 치명적

✅ 해결 방법

  • StringBuilder는 내부 버퍼에 문자열을 직접 이어붙이므로
    객체 생성이 없고, 메모리 사용량이 훨씬 작음
  • 반복문 내 문자열 조작에는 StringBuilder가 필수
  • 출력 시 .toString()으로 문자열로 변환
  • 기존에 쌓인 내용을 초기화하려면 setLength(0)을 사용하면 됨
    ➤ 객체 재사용이 가능해서 더 효율적임

🧠 내가 이 문제를 통해 배운 점

  • 문자열을 반복해서 이어붙일 땐 절대 += 쓰지 말 것!
  • StringBuilder를 사용하면 메모리 절약 + 성능 향상
  • 눈에 띄지 않아도 String 반복은 조용한 성능 폭탄 💣
  • setLength(0)으로 초기화하면 StringBuilder를 다시 쓸 수 있다
  • 실무든 알고리즘 문제든, 반복 문자열 처리 시엔 무조건 StringBuilder부터 떠올리자!

📌 예시 코드 비교

❌ 메모리 초과가 난 코드 (String)

String result = "";
for (int i = 0; i < 100000; i++) {
    result += "+\n";
}
System.out.print(result);
profile
Move forward

0개의 댓글