해결된 질문
작성
·
157
·
수정됨
1
안녕하세요 강의 잘 보고 있습니다.
보이지 않는 임시 객체 9:48초에 질문이 있습니다.
자바 컴파일러가 String s1 = "Java";를 String s1 = new String("Java");로 변환한다고 하셨는데 자바 컴파일러는 변환 하는것이 아닌걸로 이해하고 있어요.. String은 리터럴 방식과 객체 생성 방식이 다르게 관리되고 있는걸로 알고 있는데 혹시 제가 잘못 이해를 하고 있는건가 싶어서요.
답변 2
2
말씀해주신 내용을 확인했습니다. 제가 아주 중요한 한 가지를 놓치고 설명하는 바람에 혼란이 생긴 것 같습니다. 그리고 아예 잘못 설명한 부분은 지적하신 변환 부분입니다. 컴파일러가 굳이 코드를 변환하는 것은 아니라 보는 것이 맞겠습니다. 다만 실제로 new 연산이 일어나는 것은 맞다고 봐야 합니다. 대신 객체가 생성되는 위치가 Heap 영역이 아니라 Runtime constant pool입니다. 이 역할을 수행하는 함수는
String.intern() 함수이고요. 이 부분에 대해 나중에 섹션 8 JVM이 문자열 상수를 관리하는 구조에서 자세히 다룹니다.
문제점 제보 감사드리며 영상은 조속히 다시 촬영해 보완하도록 하겠습니다. 감사합니다. 😄
좋게 봐주셔서 감사합니다. 오류를 수정해 강의를 다시 올렸습니다. 제보 감사드립니다. 12월에는 Part 3 강의가 올라갑니다. 감사의 뜻을 담아 무료 수강권을 보내드리겠습니다.
cx8537@naver.com으로 인프런 가입 메일계정을 적어 메일로 보내 주시기 바랍니다. 😄
1
안녕하세요, 인프런 AI 인턴입니다. 파이팅님, “기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM” 강의와 관련한 질문에 대한 답변을 드리겠습니다.
언급하신 부분은 Java에서 문자열(String)을 처리하는 방식에 대한 중요한 개념입니다.
String 리터럴: String s1 = "Java";
이 방식은 문자열을 상수 풀(constant pool)에 저장하게 됩니다. 상수 풀은 메모리 내에서 문자열을 재사용하는 공간으로, 동일한 문자열 리터럴이 존재할 경우 새로운 객체를 생성하지 않고 기존 객체를 재사용합니다. 이로 인해 메모리 효율성을 높이고, 특정 문자열에 대한 참조 비교를 빠르게 할 수 있습니다.
객체 생성 방식: String s1 = new String("Java");
이 경우는 항상 새로운 String
객체를 힙(heap) 메모리 영역에 생성하고, 상수 풀과는 별도로 관리됩니다. 즉, 상수 풀에 아무리 같은 값이 있더라도 힙에 새로운 인스턴스를 생성합니다. 따라서, 두 방식은 메모리 관리와 객체 생성 측면에서 다르게 동작합니다.
정리하자면, 자바 컴파일러가 String s1 = "Java";
를 String s1 = new String("Java");
로 자동 변환하지 않습니다. 리터럴 방식과 객체 생성 방식은 Java의 문자열 관리 전략에 따른 두 가지 다른 방법으로, 각자 다르게 처리되고 있습니다.
이 질문과 관련해 유사한 정보를 제공하는 링크를 아래에 첨부합니다:
- Java에서의 String 객체 생성 및 메모리 관리 방식 이해하기
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
감사합니다 강의 정말 잘보고 있어요 !! 너무 재미있어서 꼼꼼하게 보는중인데 자바 강의중에서는 단연 최고인것 같아요 !!