해결된 질문
작성
·
136
·
수정됨
0
클래스 정보들이 메서드 영역에 올라 간다고 했는데 만약 A라는 클래스에 멤버 변수, 메서드, 생성자 들이 존재한다고 할때 값이 아닌 코드들 자체가 이진수로 바껴서 메서드 영역에 올라가는 건가요?
기본형 변수든 참조형 변수든 변수 자체를 가리키는 주소가 따로 있는지 궁금합니다.
pdf 자료 3페이지에 "자바에서 특정 클래스로 100개의 인스턴스를 생성하면, 힙 메모리에 100개의 인스턴스가 생긴다. 각각의 인스턴스는 내부에 변수와 메서드를 가진다." 라는 내용이 있는데요 여기서 내부에 변수와 메서드를 가진다. 부분이 이해가 안갑니다. 변수를 가진다는건 변수에 담긴 값과 변수 정보가 저장된다는건가요? 그리고 메서드를 가진다는건 이미 메서드 영역에 메서드 코드가 저장되어 있는데 왜 힙 영역에도 저장되는지 모르겠습니다.
감사합니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
감바스님의 자바 메모리 구조에 대한 질문에 답변드립니다.
네, 맞습니다. A 클래스에 있는 멤버 변수, 메서드, 생성자 등의 코드가 컴파일 시점에 바이트코드(이진수 형태)로 변환되어, 실행 시 메서드 영역에 로드됩니다. 이 메서드 영역에는 클래스에 관련된 정보들이 클래스 단위로 저장되며, 이는 모든 스레드가 공유하는 영역입니다.
변수를 가리키는 주소는 기본형 변수와 참조형 변수에서 다소 차이가 있습니다. 기본형 변수의 경우 값이 직접 저장되며, 참조형 변수는 객체의 주소를 저장합니다. 즉, 참조형 변수는 힙 메모리에 저장된 객체를 가리키는 주소 값을 가집니다.
클래스의 인스턴스(객체)가 생성될 때, 힙 메모리에 해당 객체의 상태(필드)를 저장할 공간이 할당됩니다. 여기서 ‘변수를 가진다’는 말은 객체의 상태를 나타내는 필드 값들이 힙에 저장된다는 의미입니다. ‘메서드를 가진다’라는 말은 조금 혼란스러울 수 있는데, 실제로 메서드의 코드 자체가 각 객체마다 힙 메모리에 복사되어 저장되는 것은 아닙니다. 메서드는 모든 객체가 공유하여 사용할 수 있는데, 이는 메서드 영역에 한 번만 저장되며, 객체는 이 메서드 영역의 코드를 공유하여 사용합니다. 따라서, 객체가 메서드를 ‘가진다’는 표현은 객체가 메서드 영역에 저장된 메서드를 호출할 수 있다는 의미로 이해하시면 됩니다.
질문에 대한 답변이 도움이 되었길 바랍니다.