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

pej4303님의 프로필 이미지
pej4303

작성한 질문수

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

String 클래스 - 기본

String클래스 리터럴 방식 관련 질문

작성

·

35

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
안녕하세요.

String 선언시 리터럴 방식으로하면 String Pool에 해당 문자열이 있는지 확인하고, 있다면 해당 문자열의 참조값을 사용하는 것으로 알고 있는데요.

반면 new 연산자를 이용하는 방식은 String Pool 을 거치지 않고 항상 새로운 String 객체를 생성하는걸로 알고있습니다.

 

PDF 파일 2페이지에 이런 내용이 있는데요.

편의상 쌍따옴표로 문자열을 감싸면 자바 언어에서 new Stirng("hello")와 같이 변경해준다.

리터럴 방식도 new 연산자를 이용하는 방식으로 자바가 변경해주는거라면 Heap 영역에 항상 새로운 String 객체를 생성하게 되는게 아닌지 궁금합니다.

감사합니다. 😃

답변 1

0

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

Java에서 문자열을 리터럴 방식으로 선언할 때와 new 키워드를 사용할 때의 차이점에 대해 문의하셨군요. String 리터럴의 동작 방식에 대해 설명드리겠습니다.

  1. String 리터럴 방식:

    • 예를 들어, String str = "hello";라고 하면, Java는 먼저 String Pool에 “hello”라는 문자열이 존재하는지 확인합니다.
    • 이미 “hello”가 존재한다면, 그 문자열의 참조값을 사용합니다.
    • 존재하지 않으면 String Pool에 “hello”를 추가하고 그 참조값을 사용합니다.
    • 이 방식은 메모리를 절약할 수 있으며, 동일한 문자열 간에 비교 시 equals 메서드를 호출하지 않고 참조값 비교가 가능합니다.
  2. new 연산자를 사용한 방식:

    • String str = new String("hello");라고 하면, 무조건 새로운 String 객체가 Heap 영역에 생성됩니다.
    • 이 객체는 String Pool에 저장되지 않으며, 참조 비교 시 equals 메서드를 사용하는 것이 맞습니다.

PDF 파일에서 언급된 내용은 오해의 소지가 있을 수 있습니다. 실질적으로 Java는 String 리터럴을 사용할 때 자동으로 new String()으로 감싸는 동작을 하지 않으며, String Pool을 활용하는 최적화를 진행하고 있습니다.

이에 관련된 이해를 돕기 위해 관련된 내용이 잘 설명된 게시물을 추천드립니다:
- “String과 new String 비교”를 통해 리터럴과 new 연산자의 차이를 더 깊이 이해하실 수 있습니다.

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

pej4303님의 프로필 이미지
pej4303
질문자

안녕하세요. 답변 감사합니다.

근데 알려주신 게시글 접속이 안되네요. ㅠㅠ 혹시 참고할만 다른 게시글이 있을까요?

pej4303님 저가 찾아보니까 https://www.inflearn.com/community/questions/1322032 이 글을 참조하시면 도움이 될 것 같습니다. (3.string 클래스 - pdf 6page참조)

pej4303님의 프로필 이미지
pej4303
질문자

알려주신 글 많은 도움이 되었습니다. 감사합니다. 😃

pej4303님의 프로필 이미지
pej4303

작성한 질문수

질문하기