JVM이란 무엇인가? #8
Replies: 7 comments
-
Beta Was this translation helpful? Give feedback.
-
기본질문1. JVM이 무엇인지 왜 등장하게 되었는지 설명해주세요. (Java가 플랫폼 독립적이라고 말하는 이유를 설명할 수 있어야 합니다.)자바 프로그램은을 개발하기 위해서는 우선 파일 확장명이 .java 인 텍스트 파일을 생성하고 자바 언어로 코드를 작성해야 한다. 바이트 코드 파일은 완전한 기계어가 아니므로 바로 실행할 수 있는 파일이 아니다. 바이트 코드 파일은 운영체제에서 바로 실행할 수 없고, JVM 이라는 번역기가 필요하다. JVM 이란? 보통 프로그램은 운영체제나 CPU마다 실행 방식이 다르기 때문에 그에 맞게 따로 만들어야 하지만, JVM을 통해 다양한 플랫폼에서 바이트 코드 파일을 수정하지 않고 사용할 수 있도록 하기 위함이다. 예를 들어 개발자는 윈도우 운영체제에서 편하게 프로그램(바이트 코드 파일)을 개발하고, 개발 완료된 프로그램은 리눅스로 옮겨 바로 실행할 수 있는 것이다. 자바는 처음부터 PC 프로그램만을 목표로 만들어진 언어가 아니었다. 초기에는 가전제품, 셋톱박스, 임베디드 기기처럼 서로 다른 CPU와 운영체제를 가진 황경에서 같은 프로그램을 실행하는 것을 목표로 했다. 하지만 앞서 말했듯 프로그램을 작성하면 보통 특정 운영체제와 CPU 구조에 맞게 컴파일해야 했다. Windows용 프로그램은 Windows에서만, 특정 CPU용 바이너리는 그 CPU 구조에서만 제대로 실행되는 식이었다. 자바는 이 문제를 해결하기 위해 소스 코드를 바로 기계어로 컴파일하지 않고, 먼저 바이트 코드라는 중간 코드로 컴파일한 뒤, 각 플랫폼에 설치된 JVM이 바이트 코드를 실행하는 방식을 택한 것이다. 따라서 자바는 운영체제와 CPU가 달라도 같은 바이트코드를 실행할 수 있도록 하는 플랫폭에 독립적인 특성을 가진 것이다. 2. Java 코드는 실행되는 개략적인 과정을 설명해주세요.
3. JVM 메모리 구조는 어떻게 구성되는지 설명해주세요. (해당 주제는 추후 독립 주제로 발제할 예정입니다. 간단히, Method Area, Heap, Stack, PC Register, Native Method Stacks가 있음을 인지하고, 각 영역에 어떤 데이터들이 저장되는지 간단히 짚고 넘어가도 충분합니다~)JVM의 메모리 영역인 JVM Runtime Data Area는 크게 Method Area, Heap, Stack, PC Register, Native Method Stack으로 나눌 수 있다.
[3-1. static 변수와 인스턴스 변수는 메모리상 각각 어디에 저장되나요?]
4. JAVA는 컴파일 언어와 인터프리터 언어 중 무엇인지, 아니면 둘다 해당되지 않는지 설명해주세요.컴파일 언어란 소스 코드를 실행 전에 미리 다른 형태의 코드로 번역하는 언어이다. 대표적으로 C/C++이 있다. 인터프리터 언어는 소스 코드를 미리 기계어로 번역하지 않고, 실행할 때 한 줄 씩 해석하면서 실행하는 언어이다. 대표적으로 Python, JavaScript가 있다. 자바의 경우에는 소스 코드를 바이트 코드로 컴파일하고, JVM을 통해 인터프리터와 JIT 컴파일러로 바이트 코드 파일을 해석하여 실행하는 구조이다. 5. 클래스 로더에 대해 설명해주세요, static 변수는 어떤 시점에 초기화 되나요?클래스 로더란 동적으로 JVM에서 필요한 .class 파일을 찾아 읽고, JVM의 메모리 영역에 올리는 구성 요소이다. 자바 코드는 실행 전에 전부 한꺼번에 메모리에 올라가는 것이 아니라, 필요한 클래스가 사용되는 시점에 JVM 코드가 링크되고, 실제 런타임 시점에 동적으로 로딩된다. 클래스 로더에는 3가지 종류가 있다.
static 변수는 JVM의 클래스 로더에 의해 static 변수가 있는 클래스가 처음으로 사용될 때 초기화되면서 메모리에 할당된다. |
Beta Was this translation helpful? Give feedback.
-
1. JVM이 무엇인지 왜 등장하게 되었는지 설명해주세요. (Java가 플랫폼 독립적이라고 말하는 이유를 설명할 수 있어야 합니다.)
2. Java 코드는 실행되는 개략적인 과정을 설명해주세요.
3. JVM 메모리 구조는 어떻게 구성되는지 설명해주세요.
3-1. static 변수와 인스턴스 변수는 메모리상 각각 어디에 저장되나요?
4. JAVA는 컴파일 언어와 인터프리터 언어 중 무엇인지, 아니면 둘다 해당되지 않는지 설명해주세요.
5. 클래스 로더에 대해 설명해주세요, static 변수는 어떤 시점에 초기화 되나요?
|
Beta Was this translation helpful? Give feedback.
-
1. JVM이 무엇인지 왜 등장하게 되었는지 설명해주세요. (Java가 플랫폼 독립적이라고 말하는 이유를 설명할 수 있어야 합니다.)→ JVM은 컴파일된 코드를 실행시켜주는 가상 머신이다. 어떤 플랫폼이던 어떤 운영체제던 소스를 변경하지 않아도된다. 그 이유는 .java 파일을 컴파일 하게되면 .class 파일이 생성 되고 바이트 코드들이 각자의 플랫폼에 맞게 JVM이 파일로 변환을 해주기에 독립적이라고 할 수 있다. 2. Java 코드는 실행되는 개략적인 과정을 설명해주세요.→ .java 파일을 생성하고 빌드하면 컴파일러가 javac 명령어를 이용해 .class 파일을 생성함
3. JVM 메모리 구조는 어떻게 구성되는지 설명해주세요. (해당 주제는 추후 독립 주제로 발제할 예정입니다. 간단히, Method Area, Heap, Stack, PC Register, Native Method Stacks가 있음을 인지하고, 각 영역에 어떤 데이터들이 저장되는지 간단히 짚고 넘어가도 충분합니다~)→ Method Area: 모든 스레드가 공유하는 메모리 영역 3-1. static 변수와 인스턴스 변수는 메모리상 각각 어디에 저장되나요?→ static 변수는 프로그램이 실행될때 한번만 메모리에 생성되기에 메서드 영역, 클래스 정적 영역에 저장되고 인스턴스 변수는 객체가 생성될때마다 개별 메모리에 할당되어 힙 영역에 저장된다. 4. JAVA는 컴파일 언어와 인터프리터 언어 중 무엇인지, 아니면 둘다 해당되지 않는지 설명해주세요.→ 컴파일 언어와 인터프린터 언어 둘다 속하지 않고 각자의 방식을 혼합한 언어이다.
5. 클래스 로더에 대해 설명해주세요, static 변수는 어떤 시점에 초기화 되나요?.java가 변환한 바이트 코드를 읽어 JVM 메모리에 적재시키는 시스템을 클래스 코더라고 한다 |
Beta Was this translation helpful? Give feedback.
-
1. JVM이 무엇인지 왜 등장하게 되었는지 설명해주세요. (Java가 플랫폼 독립적이라고 말하는 이유를 설명할 수 있어야 합니다.)1-1) JVM 이 무엇인가? 사람이친 자바 소스 코드를 컴파일하여 만들어진 바이트 코드를 실행하는 가상의 기계이다. 자신 컴퓨터의 CPU 와 OS 에 맞는 기계어를 만들어준다. 1-2) 왜 등장하였는가? 자바 이전 옛날의 언어들은 소스코드를 특정 OS/CPU 에 맞는 기계어로 직접 컴파일 했다. 다른 플랫폼에서 컴파일한 실행파일은 자신의 플랫폼에서 돌아가지 않는 문제가 발생했다. 1-3)자바는 왜 플랫폼 독립적인가? JVM 은 왜 플랫폼 종속적인가? 자바의 소스코드를 컴파일 하면 바이트 코드가 나오는데 이 바이트 코드는 플랫폼에 상관없이 동일하고, JVM 만 이해가 가능하다. 실제 실행시 각 플랫폼에 맞게 만들어진 JVM 이 바이트코드를 해당 플랫폼에 맞는 기계어로 변환한다. 2. Java 코드가 실행되는 개략적인 과정을 설명해주세요.
3. JVM 메모리 구조는 어떻게 구성되는지 설명해주세요.
4. JAVA는 컴파일 언어와 인터프리터 언어 중 무엇인지, 아니면 둘다 해당되지 않는지 설명해주세요.둘다 해당된다. 컴파일 : 소스코드를 실행전에 바이트코드로 컴파일 한다. 인터프리터 : 이 바이트코드를 JVM의 인터프리터가 런타임에 한줄 씩 해석한다. JIT : 자주 쓰이는 코드는 JIT 컴파일러가 런타임에 기계어로 다시 컴파일 컴파일과 인터프리터는 무엇이 다른가? 둘다 번역인데 실행 전에 전체를 미리 번역하면 컴파일 실행 중에 한줄 씩 번역하면 인터프리터다. 5. 클래스 로더에 대해 설명해주세요, static 변수는 어떤 시점에 초기화 되나요?260707.0208 : 다음에 이어서… |
Beta Was this translation helpful? Give feedback.
-
|
먼저 JVM의 구성에 대해서 살펴보자면
JVM 의 하위 구성
1. JVM이 무엇인지 왜 등장하게 되었는지 설명해주세요. 2. Java 코드는 실행되는 개략적인 과정을 설명해주세요. 3. JVM 메모리 구조는 어떻게 구성되는지 설명해주세요.
4. JAVA는 컴파일 언어와 인터프리터 언어 중 무엇인지, 아니면 둘다 해당되지 않는지 설명해주세요. 5. 클래스 로더에 대해 설명해주세요, static 변수는 어떤 시점에 초기화 되나요?
|
Beta Was this translation helpful? Give feedback.
-
1. JVM이 무엇인지 왜 등장하게 되었는지 설명해주세요. (Java가 플랫폼 독립적이라고 말하는 이유를 설명할 수 있어야 합니다.)JVM, Java Virtual Machine은 자바 프로그램을 실행해주는 가상머신입니다. 등장 배경으로는 개발자들이 주로 쓰던 C언어에서의 플랫폼 종속성 때문입니다. C언어의 플랫폼 종속성이라함은 C언어로 코드를 짜서 컴파일을 해서 실행 파일을 생성해도 그 실행 파일은 특정 OS 전용 실행 파일이 되었습니다. 그래서 C언어로 개발을 할 경우 윈도우 환경, 맥 환경 등 여러 플랫폼을 고려해서 코드를 서로 다르게 짜야했습니다. 이런 번거러움을 해결하기 위해 어떤 플랫폼에 종속되지 않고 독립적으로 개발을 할 수 있도록 등장한 것이 JVM 입니다. JVM의 역할은 Java로 작성된 소스파일을 컴파일하여 변환된 .class 바이트 코드를 JVM 위에서 실행하여 하나의 소스코드로 모든 플랫폼에서 실행 가능하도록 합니다. 2. Java 코드는 실행되는 개략적인 과정을 설명해주세요.Java는 개발자에 의해 .java의 소스 코드가 작성되고 이를 컴파일하게 되면 바이트 코드 형태인 .class가 됩니다. 이후 JVM의 클래스 로더가 .class파일들을 메모리에 적재하고 적재된 바이트 코드는 JVM의 실행 엔진에 의해 기계어 번역이 되며 실행됩니다. 실행 중에는 JVM의 GC(Garbage Collector)에 의해 더 이상 사용하지 않는 객체를 추적해 청소하며 메모리를 확보해줍니다. 3. JVM 메모리 구조는 어떻게 구성되는지 설명해주세요. (해당 주제는 추후 독립 주제로 발제할 예정입니다. 간단히, Method Area, Heap, Stack, PC Register, Native Method Stacks가 있음을 인지하고, 각 영역에 어떤 데이터들이 저장되는지 간단히 짚고 넘어가도 충분합니다~)JVM 메모리는 모든 스레드가 공유하는 Method Area, Heap이 있고 각 스레드가 독립적으로 사용하는 Stack, PC Register, Native Method Stack이 있습니다. 먼저 모든 스레드가 공유하는 메소드 영역과 힙 영역을 설명하자면 메소드 영역은 .class가 메모리에 적재 된다면 제일 먼저 메소드 영역에 클래스의 타입 정보, 필드 정보, 매서드 정보에 대한 구조 정보와 static으로 선언된 변수를 적재하고, 힙 영역은 new 연산자로 선언된 객체가 적재됩니다. 그리고 각 스레드가 독립적으로 사용하는 스택은 메서드에 선언된 지역 변수, 매개 변수, 연산 중 발생하는 값들이 저장되고, PC 레지스터에는 스레드가 CPU에 실행할 명령어 들이 담깁니다. 마지막으로 Native Method Stack에는 C나 C++과 같은 다른 언어로 작성된 코드를 실행하기 위한 영역입니다. Java 프로그램에서 갑자기 다른 언어라는 말은 예를 들어 하드웨어 조작은 OS의 커널이 합니다. OS는 C로 작성됐고 이때 자바 프로그램이 하드웨어 조작을 해야한다면 결국 OS의 C언어에 의존을 하게 되고 이때 C언어가 실행되기 위한 메모리 영역이 Native Method Stack이 됩니다. 3-1. static 변수와 인스턴스 변수는 메모리상 각각 어디에 저장되나요?static 변수는 메소드 영역에 저장되고, 인스턴스 변수는 힙 영역에 저장됩니다. 이유에 대해 서술해보자면 static 변수의 경우에는 프로그램 실행동안 고정적으로 언제든 사용될 수 있는 변수를 뜻하고 인스턴스 변수는 객체가 가지는 변수입니다. 두 변수는 각각 프로그램의 수명을 따르고 객체의 수명을 따라야 합니다. 이때 매소드 영역은 프로그램 실행 종료까지의 정적 영역이며 힙 영역은 GC에 의해 관리되는 즉, 객체의 수명을 가지는 영역입니다. 따라서 두 변수는 각자의 수명에 맞는 영역에 저장되는 것입니다. 4. JAVA는 컴파일 언어와 인터프리터 언어 중 무엇인지, 아니면 둘다 해당되지 않는지 설명해주세요.Java는 소스 파일이 .class 바이트 코드로 변환할 때, 컴파일 언어의 특징을 가지고 .class를 JVM 위에서 실행할때 인터프리터 언어의 특징을 가집니다. 하지만 JVM에서 실행될 때 인터프리터 언어의 특징에 맞게 한줄 씩 읽으며 실행하다 자주 반복되는 코드를 발견한다면 이를 JIT 컴파일러로 해당 부분을 번역하여 캐싱해두는 방식을 이용합니다. 5. 클래스 로더에 대해 설명해주세요, static 변수는 어떤 시점에 초기화 되나요?클래스 로더는 JVM에서 로딩, 링킹, 초기화의 역할을 하는 모듈입니다. 로딩 작업에선 .class 바이트 코드를 읽어서 클래스 구조 정보를 메모리에 메서드 영역에 적재해주고 링킹 작업에선 .class 파일을 검증하고 로딩 과정에서 담긴 구조 정보를 파악하며 static 변수를 위한 메모리 공간을 확보하며 참조 주소를 연결합니다. 이후 초기화 작업에서 링킹 작업에 확보했던 static 변수를 초기화합니다. |
Beta Was this translation helpful? Give feedback.

Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
📆 일자: 26년 7월 6일(월)
발제 의도
기본 질문 (필수)
3-1. static 변수와 인스턴스 변수는 메모리상 각각 어디에 저장되나요?
참고 자료
꼬리 질문 및 답변 보기
1. JVM이 무엇인지, 왜 등장했는지
Q. JVM은 정확히 무엇인가요?
의도: JVM을 단순 실행 프로그램이 아니라 Java 실행 환경으로 이해하는지 확인.
답변: JVM은 Java 바이트코드를 OS와 하드웨어에 맞게 실행해주는 가상 머신입니다. Java 컴파일러가 .java를 .class 바이트코드로 만들면, JVM이 이를 로딩하고 검증한 뒤 인터프리터나 JIT 컴파일러를 통해 실행합니다.
Q. Java가 플랫폼 독립적이라고 말하는 이유는 무엇인가요?
의도: “한 번 작성하면 어디서나 실행”의 실제 의미 확인.
답변: Java 소스가 모든 플랫폼에서 바로 실행되는 것이 아니라, 컴파일 결과인 바이트코드가 플랫폼 독립적입니다. 각 OS에는 해당 OS용 JVM이 있고, JVM이 바이트코드를 OS에 맞게 실행해주기 때문에 같은 .class 파일을 여러 환경에서 실행할 수 있습니다.
Q. 그러면 JVM 자체도 플랫폼 독립적인가요?
의도: 자주 나오는 함정 질문.
답변: 아닙니다. JVM은 OS와 CPU 아키텍처에 맞게 구현되어야 하므로 플랫폼 의존적입니다. 플랫폼 독립적인 것은 Java 바이트코드입니다.
Q. JVM이 없으면 Java 코드를 실행할 수 없나요?
의도: Java 실행 모델 이해 확인.
답변: 일반적인 Java 실행 방식에서는 JVM이 필요합니다. Java 코드는 바이트코드로 컴파일되고, 이 바이트코드를 실행하는 주체가 JVM이기 때문입니다.
2. Java 코드 실행 과정
Q. Java 코드는 실행될 때 어떤 과정을 거치나요?
의도: 컴파일, 클래스 로딩, 실행 과정을 순서대로 말할 수 있는지 확인.
답변: .java 파일을 javac가 컴파일해 .class 바이트코드로 만듭니다. 이후 JVM이 클래스 로더를 통해 필요한 클래스를 로딩하고, 바이트코드를 검증한 뒤 Runtime Data Area에 배치합니다. 그 다음 인터프리터와 JIT 컴파일러가 바이트코드를 실행합니다.
Q. 바이트코드는 왜 필요한가요?
의도: JVM과 플랫폼 독립성의 핵심을 아는지 확인.
답변: 바이트코드는 JVM이 이해할 수 있는 중간 코드입니다. OS별 기계어로 바로 컴파일하지 않고 바이트코드로 만들기 때문에, 각 플랫폼의 JVM이 같은 바이트코드를 실행할 수 있습니다.
Q. Java 실행이 느리다는 말은 왜 나왔나요?
의도: 인터프리터 방식과 JIT 최적화 이해 확인.
답변: 초기 Java는 바이트코드를 한 줄씩 해석하는 인터프리터 방식 때문에 네이티브 코드보다 느릴 수 있었습니다. 하지만 현재 JVM은 자주 실행되는 코드를 JIT 컴파일러로 기계어로 변환해 캐싱하고 최적화하기 때문에 성능 차이가 줄었습니다.
Q. JIT 컴파일러는 언제 동작하나요?
의도: JIT을 단순 “빠르게 해주는 것” 이상으로 이해하는지 확인.
답변: JVM이 실행 중에 자주 호출되는 코드, 즉 hot spot을 감지하면 JIT 컴파일러가 해당 바이트코드를 네이티브 기계어로 컴파일합니다. 이후 같은 코드는 해석하지 않고 컴파일된 코드를 실행합니다.
3. JVM 메모리 구조
Q. JVM 메모리 구조는 어떻게 나뉘나요?
의도: Runtime Data Area의 큰 그림 확인.
답변: JVM 메모리는 크게 Method Area, Heap, Stack, PC Register, Native Method Stack으로 나뉩니다. Method Area에는 클래스 메타데이터와 static 정보가 저장되고, Heap에는 객체가 저장됩니다. Stack에는 메서드 호출마다 생성되는 스택 프레임과 지역 변수, 참조값이 저장됩니다. PC Register는 현재 실행 중인 명령어 위치를 저장하고, Native Method Stack은 네이티브 메서드 실행에 사용됩니다.
Q. Heap과 Stack의 차이는 무엇인가요?
의도: 객체와 참조 변수의 위치를 구분하는지 확인.
답변: Heap은 객체 인스턴스가 저장되는 공유 메모리 영역이고, Stack은 각 스레드마다 생성되며 메서드 호출 정보와 지역 변수가 저장됩니다. 예를 들어 User user = new User()에서 실제 User 객체는 Heap에 있고, user라는 참조 변수는 지역 변수라면 Stack 프레임에 저장됩니다.
Q. Method Area에는 무엇이 저장되나요?
의도: static, 클래스 메타데이터 위치 확인.
답변: 클래스 이름, 부모 클래스 정보, 메서드 정보, 필드 정보, static 변수, 런타임 상수 풀 같은 클래스 수준의 정보가 저장됩니다.
Q. Stack은 스레드마다 따로 있나요?
의도: 멀티스레드와 메모리 구조 연결 확인.
답변: 네. Stack, PC Register, Native Method Stack은 스레드마다 별도로 존재합니다. 반면 Heap과 Method Area는 여러 스레드가 공유합니다.
3-1. static 변수와 인스턴스 변수
Q. static 변수는 어디에 저장되나요?
의도: 클래스 변수와 인스턴스 변수의 차이 확인.
답변: static 변수는 클래스에 소속된 변수이므로 클래스 로딩 시 Method Area에 클래스 메타데이터와 함께 관리됩니다. JVM 구현에 따라 실제 저장 방식은 달라질 수 있지만, 개념적으로는 클래스 수준의 메모리 영역에 저장된다고 보면 됩니다.
Q. 인스턴스 변수는 어디에 저장되나요?
의도: 객체 내부 상태를 이해하는지 확인.
답변: 인스턴스 변수는 객체마다 따로 존재하므로 객체가 생성되는 Heap 영역에 객체와 함께 저장됩니다.
Q. 지역 변수는 어디에 저장되나요?
의도: static/instance/local 구분 확인.
답변: 지역 변수는 메서드 호출 시 생성되는 Stack 프레임에 저장됩니다. 단, 지역 변수가 객체를 참조한다면 참조값은 Stack에 있고 실제 객체는 Heap에 있습니다.
Q. static 변수는 모든 객체가 공유하나요?
의도: static의 의미 확인.
답변: 네. static 변수는 객체가 아니라 클래스에 소속되므로 해당 클래스로 생성된 여러 인스턴스가 같은 static 변수를 공유합니다.
4. Java는 컴파일 언어인가 인터프리터 언어인가
Q. Java는 컴파일 언어인가요, 인터프리터 언어인가요?
의도: Java 실행 방식의 혼합 구조를 이해하는지 확인.
답변: Java는 소스 코드를 바이트코드로 컴파일한다는 점에서 컴파일 과정을 거치고, JVM이 바이트코드를 실행 시점에 해석하거나 JIT 컴파일한다는 점에서 인터프리터적 특성도 가집니다. 그래서 단순히 하나로만 분류하기보다는 컴파일과 인터프리터 방식을 함께 사용하는 언어라고 설명하는 것이 정확합니다.
Q. C/C++과 Java의 컴파일 결과는 어떻게 다른가요?
의도: 네이티브 컴파일과 바이트코드 컴파일 비교.
답변: C/C++은 보통 특정 OS와 CPU에서 바로 실행 가능한 네이티브 기계어로 컴파일됩니다. Java는 JVM이 실행할 수 있는 바이트코드로 컴파일되고, 실행 시 JVM이 이를 해석하거나 JIT으로 기계어 변환합니다.
Q. JIT이 있으면 Java도 완전한 컴파일 언어 아닌가요?
의도: JIT의 위치 이해 확인.
답변: JIT 컴파일은 실행 중에 JVM 내부에서 일어나는 동적 컴파일입니다. 소스 코드가 처음부터 특정 플랫폼의 기계어로 컴파일되는 방식과는 다릅니다. 그래서 Java는 정적 컴파일 언어와 동일하게 보기는 어렵습니다.
5. 클래스 로더와 static 초기화
Q. 클래스 로더란 무엇인가요?
의도: 클래스가 언제, 어떻게 JVM에 올라가는지 확인.
답변: 클래스 로더는 .class 파일을 JVM으로 읽어 들여 Runtime Data Area에 배치하는 역할을 합니다. 클래스 로딩은 보통 Loading, Linking, Initialization 단계로 진행됩니다.
Q. 클래스 로딩 단계는 어떻게 나뉘나요?
의도: 클래스 로더를 깊게 이해하는지 확인.
답변: 크게 Loading, Linking, Initialization으로 나뉩니다. Loading은 클래스 파일을 읽어오는 단계입니다. Linking은 검증, 준비, 해석 과정으로 구성되고, 이때 static 변수의 메모리 할당과 기본값 설정이 일어납니다. Initialization 단계에서 static 변수의 명시적 초기화와 static block이 실행됩니다.
Q. static 변수는 정확히 언제 초기화되나요?
의도: preparation과 initialization을 구분하는지 확인.
답변: static 변수는 Linking의 Preparation 단계에서 메모리가 할당되고 기본값으로 먼저 설정됩니다. 이후 Initialization 단계에서 코드에 작성된 명시적 값이나 static block이 실행되면서 실제 값으로 초기화됩니다.
Q. 예를 들어 static int count = 10;이면 언제 10이 들어가나요?
의도: 기본값 초기화와 명시적 초기화 구분 확인.
답변: Preparation 단계에서는 count가 기본값인 0으로 설정됩니다. 이후 Initialization 단계에서 10이라는 명시적 초기화가 실행되어 값이 10이 됩니다.
Q. 클래스는 언제 로딩되나요?
의도: lazy loading 이해 확인.
답변: JVM은 모든 클래스를 시작 시점에 한 번에 로딩하지 않고, 보통 해당 클래스가 처음 사용될 때 로딩합니다. 예를 들어 객체 생성, static 멤버 접근, static 메서드 호출 등이 클래스 초기화를 유발할 수 있습니다.
Q. static block은 언제 실행되나요?
의도: 클래스 초기화 타이밍 확인.
답변: static block은 클래스 초기화 단계에서 한 번만 실행됩니다. 객체를 여러 개 생성해도 클래스 초기화는 보통 한 번만 일어나므로 static block도 한 번만 실행됩니다.
Beta Was this translation helpful? Give feedback.
All reactions