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

파이팅님의 프로필 이미지
파이팅

작성한 질문수

기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM

클래스 로더 및 로딩 과정

클래스 로더 및 로딩 과정 16:00초에 질문 있습니다.

해결된 질문

작성

·

105

·

수정됨

0

안녕하세요 강의 잘 보고 있습니다.

다름이 아니라 클래스 로더 및 로딩 과정 16:00초에 질문이 있는데요.

링킹 준비 단계에서 "객체 인스턴스가 저장될 메모리 공간을 확보하고 0으로 초기화"라고 되어 있는데, 제가 알기로는 클래스 수준의 정적 필드가 기본값으로 초기화로 알고 있습니다.

객체 인스턴스는 객체가 생성 되었을 때 기본 값으로 초기화가 이뤄지고 생성자가 있을때 말씀처럼 초깃값이 다시 설정 되는걸로 알고 있는데요. 제가 잘못 이해 한걸까요.

답변 2

0

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

잘못 알고 계시는 것입니다. Java에서 필드의 기본 값은 모두 0입니다. 이는 클래스 로더가 모두 0으로 초기화 한 후 생성자를 통한 추가 초기화 작업을 하기 때문입니다. 그리고 정적 필드의 메모리 공간은 인스턴스 메모리가 아니며 C/C++의 정적 메모리처럼 0초기화 합니다. 아마도 C++의 상황을 Java에서도 같은 구조일 것으로 예상한 것이 아닌가 짐작해봅니다.

Java에서 모든 필드가 0초기화 되는 것이 확실한 명백한 이유는 쉽게 확인 할 수 있습니다. 클래스 선언 및 정의과정에서 모든 필드의 초깃값을 아무 것도 정의하지 않은 상태에서 즉시new 연산 후 값을 출력해보는 것입니다. 모두 0이 출력 될 것입니다. 그러나 C++라면 쓰레기 값을 출력 될 것입니다.

참고하시기 바랍니다. 😄

파이팅님의 프로필 이미지
파이팅
질문자

이는 클래스 로더가 모두 0으로 초기화 한 후 생성자를 통한 추가 초기화 작업을 하기 때문입니다.

예 맞습니다. 하지만 제가 말씀드리고 싶은 건 정확한 타이밍에 대한 질문이였던 것 같습니다. Linking Preparation 과정에서 클래스 수준의 static 필드에 대한 기본값(0,0.0,false,null)이 초기화가 되고 Using Initialization 과정에서 static 필드에 초기 값이 설정이 되며, Using Using 단계에서 객체를 생성하는데 Using Using 단계 즉 객체를 생성할 때 필드의 기본값이 설정되는 걸로 알고 있습니다. 하지만 강사님 자료에서 링킹 준비 단계에 "객체 인스턴스가 저장될 메모리 공간을 확보하고 0으로 초기화"라고 되어 있어서..

혹시나 제가 잘못 알고 있을까 봐 자바의 정석 및 오라클 문서를 살펴보았는데 제가 이해한 것과 크게 틀리지 않은 것 같아 강사님은 어떻게 생각하시는지 여쭤보고 싶었습니다.

 

https://docs.oracle.com/javase/specs/jvms/se20/html/jvms-5.html#jvms-5.4.2

: 링킹 준비 단계에서는 정적 필드에 대한 기본값을 설정하는 부분만 명시 되어 있고 일반 필드의 기본값 설정 얘기는 없습니다.

https://docs.oracle.com/javase/specs/jls/se20/html/jls-12.html#jls-12.5

: 객체 생성시 기본값 설정에 대한 부분 입니다 (§4.12.5).

 

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

결론부터 말씀드리겠습니다. 파이팅 님이 말씀하신 내용이 맞습니다. 우선 강의자료에 오류가 있음을 확인했습니다. 클래스 준비과정에서 확보하는 메모리는 클래스 자체에 관한 정보를 담고 있는 java.lang.class 클래스 인스턴스에 대한 것인데 이를 마치 클래스의 인스턴스가 생성되는 것으로 잘못 설명했습니다.

new 연산이 수행되는 Using 단계에서 초기 및 사용으로 이어지는 것이 맞으며 이는 클래스 로딩이 완전히 끝난 후가 됩니다. 정리하면...

클래스 준비단계에서는
1. 로딩 할 클래스를 표현하기 위한 java.lang.Class 객체가 힙에 생성되며 이 Class 클래스 인스턴스는 로딩할 클래스를 활용하기 위한 정보가 저장됩니다.
2. 정적 필드가 저장될 공간은 0으로 초기화 됩니다.

제보에 다시 한 번 감사말씀 드립니다. 이미 Part 3 수강권을 드리겠다 하였으므로 제가 올린 강의 중 원하시는 강의를 하나 말씀해주시기 바랍니다. 무료로 수강하실 수 있도록 조치하겠습니다. 감사합니다. 😄

0

안녕하세요, 인프런 AI 인턴입니다. 파이팅님, “기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM” 강의와 관련한 질문에 대한 답변을 드리겠습니다.

귀하의 질문에서 언급하신 부분은 클래스 로더와 로딩 과정, 특히 링크 준비 단계에서 메모리 초기화에 관한 내용입니다.

  1. 정적 멤버의 초기화: 정적 멤버(클래스 변수)는 클래스가 메모리에 로드될 때 기본값으로 초기화됩니다. 정수형은 0, 논리형은 false, 참조형은 null로 초기화됩니다. 이는 클래스가 첫 사용되는 순간(주로 그 클래스의 첫 인스턴스 생성, 정적 메소드 접근 등) 클래스 로딩 및 초기화 단계에서 이루어집니다.

  2. 객체 인스턴스 멤버의 초기화: 인스턴스 변수는 실제로 객체가 생성될 때 기본값으로 초기화됩니다. 즉, 객체 생성 시 JVM은 먼저 해당 객체의 메모리를 할당하고 그 기본 초기값을 설정한 후 생성자가 호출됩니다. 생성자가 제공하면 추가적인 초기값 설정이 이루어질 수 있습니다.

그래서 말씀하신 내용은 정확히 맞습니다. 클래스 준비 단계에서 초기화되는 것은 클래스 수준의 정적 필드이며, 객체 인스턴스의 필드는 객체 생성 시점에서 초기화됩니다.

이 질문과 관련하여 더 자세한 설명이 담긴 링크를 추천해드립니다:

이 링크는 클래스 로딩 메커니즘 및 초기화 프로세스에 대한 유사한 설명을 제공하고 있습니다.

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

파이팅님의 프로필 이미지
파이팅

작성한 질문수

질문하기