본문 바로가기
앱 만들기/Java

자바 static , 인스턴스 멤버가 메모리에 올라가는 순서를 알아보자

by 나도처음이야 2025. 2. 6.
반응형

자바코드 는 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 부분은 실행되지 않는다.

반응형

댓글