작성
·
81
0
강의에서 각 스레드 스택 마다 지역변수로 objectReference 참조 변수를 생성하시는 것을 예시로 들어주셧는데요,
해당 변수는 문자열 풀 값들을 이용해서 만들어진 것이잖아요.
힙에 저장될 때 어떻게 데이터가 저장되나요?
thread 1번에서 생성한 지역변수인 objectReference 는
"1" 의 문자열 풀 주소값 + ": Hello World" 의 문자열 풀 주소값,
thread 2번에서 생성한 지역변수인 objectReference 는
"2" 의 문자열 풀 주소값 + ": Hello World" 의 문자열 풀 주소값,
...
이렇게 저장되는 것이 맞을까요??
혹은 "1 : Hello World" 라는 문자열 전체가 하나의 스트링 풀에 저장되고, 그 상수에 대한 주소값이 저장되는 것일까요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
hylim님,
질문해주신 내용을 바탕으로 설명드리겠습니다.
Java의 문자열 풀(string pool)은 동일한 문자열 리터럴이 중복 저장되지 않도록 관리해주는 힙 영역의 일종입니다. 따라서 문자열 풀에 저장된 문자열은 각기 고유한 주소값을 가지게 됩니다.
귀하의 예시와 관련하여 두 가지 가능성이 있습니다:
문자열 풀을 이용한 부분 문자열의 조합:
String part1 = "1";
String part2 = " : Hello World";
String combined = part1 + part2;
이 경우, combined
는 실제로 문자열 풀에서 “1”과 “: Hello World”를 찾아 이들을 조합하여 새로운 문자열 객체를 생성합니다. 이 새 객체는 힙 영역의 일반적인 문자열 객체로 저장되고, 문자열 풀에는 존재하지 않습니다.
전체 문자열의 리터럴:
만약 “1 : Hello World”가 코드 내에 리터럴로 직접 선언된다면, 해당 문자열 리터럴은 문자열 풀에 저장됩니다. 예를 들면:
String literal = "1 : Hello World";
이 경우에는 문자열 풀에 “1 : Hello World”가 저장되고, literal
변수는 이 문자열 리터럴의 주소값을 참조하게 됩니다.
따라서, thread 1
과 thread 2
에서 string concatenation(문자열 연결)을 통해 생성된 문자열은 힙 메모리의 일반 문자열 객체로 저장되며, 문자열 풀에 저장되지 않습니다. 반면, 전체 문자열 리터럴로 선언된 문자열은 문자열 풀에 저장되어 동일한 주소값을 참조하게 됩니다.
자세하게는, 문자열 풀에 대한 이해를 위해 Spring Boot 공식 문서를 참고해 보시는 것도 좋습니다.
참조 URL: Spring Boot Reference Documentation v3.1.5
추가적인 질문이 있다면 언제든지 문의해 주세요.
감사합니다.