인프런 커뮤니티 질문&답변

도토리님의 프로필 이미지
도토리

작성한 질문수

김영한의 실전 자바 - 중급 1편

String 클래스 - 불변 객체

concat()이 내부적으로 생성하는 String 인스턴스

작성

·

160

0

public class StringImmutable2 {

    public static void main(String[] args) {

        String before = "hello";
        String after = before.concat(" java");

        System.out.println("before = " + before);
        System.out.println("after = " + after);
    }
}

자바 프로그램 로딩 시점에 문자열 리터럴이 문자열 풀에 보관된다고 알고 있는데요. 위 코드에서 "hello" 뿐만 아니라 " java"도 문자열 리터럴인가요? 그렇다면 " java"도 문자열 풀에 저장되는 것인가요? (제가 자바 기초 지식이 부족한 상태입니다)

concat() 내부에서 생성하는 String 인스턴스는 문자열풀에 생성되는 것인가요? 아니면 문자열풀이 아닌 힙 영역에 생성되는 것인가요?

답변 1

1

안녕하세요, 인프런 AI 인턴입니다.

도토리님께서 제시한 문제는 Java 문자열 리터럴의 저장 방식과 concat() 메소드에 의해 생성되는 String 인스턴스의 메모리 저장 위치에 대한 질문입니다. Java에서 문자열 리터럴은 컴파일 시점에 String Pool(문자열 풀)에 저장되며, 이 곳은 JVM의 메모리 영역 중 하나인 Heap 영역 안에 위치합니다. 문자열 리터럴은 동일한 문자열에 대해 중복을 피하기 위하여 이 풀을 사용합니다.

질문하신 "hello"" java" 모두 문자열 리터럴로 간주되어 컴파일 시점에 문자열 풀에 저장됩니다. 따라서, before.concat(" java") 호출에 의해 생성되는 새로운 문자열 "hello java"에 대한 질문인데, 이는 조금 다른 처리 방식을 따릅니다.

concat() 메소드에 의해 생성된 새로운 String 인스턴스는 기본적으로 Heap 영역 내에 저장되지만, 문자열 풀(String Pool)에는 자동으로 저장되지 않습니다. 문자열 풀에 추가하기 위해서는 intern() 메서드의 명시적 호출이 필요합니다. 따라서, 기본적으로 concat() 메소드를 사용할 때 생성되는 새로운 String 객체는 힙 영역에 저장되지만 문자열 풀에는 저장되지 않습니다.

도토리님의 이해를 돕기 위해 기존 답변 중에서 유사한 질문의 답변을 찾은 바 있습니다:

이 답변에서 비슷한 맥락의 내용을 다루고 있으며, String 객체와 불변성에 대해 설명하고 있습니다. concat() 메소드에 의해 생성된 String 인스턴스에 관한 직접적인 언급은 없으나, 문자열의 불변성 및 새로운 문자열 객체의 생성과 관련된 비슷한 주제를 다루고 있어 도움이 될 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

도토리님의 프로필 이미지
도토리

작성한 질문수

질문하기