자바 static , 인스턴스 멤버가 메모리에 올라가는 순서를 알아보자
자바코드 는 JVM에 의해서 3가지 메모리 영역에 나뉘에서 올라간다.
메모리 영역.
1. 메소드 영역 : 클래스 로딩시 static 필드 및 static 블록 실행. 메소드 코드, 생성자 , 바이트 코드
2. 힙(Heap) : 객체마다 별도의 인스턴스 필드가 할당됨.
3. 스택 : 지역변수, 매개변수.
메소드 영역은 프로그램이 종료될때 까지 유지된다.
힙은 해당 객체의 라이프사이클과 같이 하며, 스택역시 변수의 라이프사이클과 그 생명을 같이 한다.
static 과 인스턴스 필드, 블럭의 실행순서를 하기 예제코드로 알아본다.
package com.study;
public class staticInstance {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("3.main() 실행");
staticInstance obj1 = new staticInstance();
staticInstance obj2 = new staticInstance();
}
staticInstance(){
System.out.println("6.생성자");
}
static int staticVar = initializeStatic();
int instanceVar = initializeInstance();
static int initializeStatic() {
System.out.println("1.static 변수 초기화");
return 100;
}
int initializeInstance() {
System.out.println("4.Instance 변수 초기화");
return 200;
}
//static 초기화 블럭
static {
System.out.println("2.static 초기화 블럭");
}
//인스턴스 초기화 블럭
{
System.out.println("5.Instance 초기화 블럭");
}
}
결과 이다.
1.static 변수 초기화
2.static 초기화 블럭
3.main() 실행
4.Instance 변수 초기화
5.Instance 초기화 블럭
6.생성자
4.Instance 변수 초기화
5.Instance 초기화 블럭
6.생성자
위 코드에서 메모리 로딩 순서를 정리하자면,
1. 클래스 로딩시 (static 멤버) 가 먼저 로딩된다.
1-1. static 변수 초기화
1-2. static 블록 실행
이 단계는 한번만 실행되며, 클래스가 메모리에 로드될때 수행된다.
2. main()실행
3. 객체 생성시(인스턴스 멤버)
3-1. 인스턴스 변수 초기화
3-2. 인스턴스 블럭 실행
3-3. 생성자 실행.
결론은,
1. static 필드 및 블럭은 클새스 로드시 한번만 실행된다.
2. main() 실행후, 객체가 생성될때마다 인스턴스 필드, 인스턴스 블록, 생성자 순으로 실행된다.
3. 새로운 객체를 만들면 인스턴스 관련 코드만 새롭게 실행되며, static 부분은 실행되지 않는다.