-
불변 객체인 String 생성 반복에 대한 기록Java 2025. 3. 4. 00:16
상황 : 코딩 테스트 문제를 Java 언어를 통해 풀다가 문자열을 매번 새로 생성하는 방식이 왜 성능이 좋지 못한지에 대한 의문이 생겼습니다. 메모리 영역과 관련있는 내용임을 파악했고, 머리에서 휘발되기 전에 기록해둡니다!
String answer = "0"; // 아래 코드를 for문으로 반복 answer = i + answer + i;
String이 불변 객체?
String은 불변(immutable)객체입니다. 여기서 불변 객체라고 함은 변경되지 않는다는 의미가 맞습니다. 그러나 변수의 관점에서 불변을 이해하면 안 되고, 생성된 객체의 관점에서 이해해야 합니다.
변수를 기준으로 보면 String 변수는 언제든 바뀔 수 있는 값입니다.
변수를 통해 String 값을 할당하면, Heap 메모리 영역 String constant pool 라는 공간에 문자열 객체(주소 : a)로서 생성됩니다.
그리고 우리가 String 변수의 값을 바꾸면 새로운 문자열 객체(주소 : b)가 Heap 메모리 영역에 다시 생성되고, String 변수는 주소 b를 가리킵니다.
즉, 주소 a의 객체 자체가 변경된 건 아니니 String은 불변(immutable)객체라는 겁니다.
본론으로 돌아와서 왜 성능이 좋지 않다고 하느냐면, 결국 answer = i + answer + i 를 할 때마다 answer은 불변 객체이기 때문에 매번 Heap 메모리 영역에 새로운 문자열 객체를 생성합니다.
즉, 매번 새로운 메모리 영역을 할당하고, 기존 문자열을 복사하는 과정을 반복하면서 성능에 저하가 온다는 것이었습니다.
참조자료
Java의 String 이야기(1) - String은 왜 불변(Immutable)일까?
제목에 적혀있다시피 Java에서 String은 불변(Immutable)입니다. 그럼 불변이란 무엇일까요? 불변은 말 그대로 아닐 불(不) 변할 변(變). 변하지 않는 것을 의미합니다. 그럼 Java에서 String이 불변이라는
readystory.tistory.com
'Java' 카테고리의 다른 글
HashSet 의 내부 동작 방식 (0) 2025.01.22 Java : 각 자료형 간의 변환 정리 (0) 2025.01.20 Stream API의 map과 flatMap (0) 2025.01.13 객체 지향 설계 원칙 SOILD, SRP와 OCP (0) 2025.01.13 BufferedReader, BufferedWriter 기록 (0) 2025.01.10