본문 바로가기
Java/Java

변수) 인스턴스 변수의 초기화 순서, static 변수의 초기화 순서

by 박채니 2022. 3. 16.
SMALL

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


☞ 인스턴스(멤버) 변수의 초기화 순서 (객체 생성)

① 타입 별 초기값 세팅

② 명시적 초기값 대입

③ 초기화 블럭에서 대입한 값

④ 생성자에서 대입한 값

 

우선순위

(낮음) 초기값 → 명시적 초기값 → 초기화 블럭 → 생성자 (높음)

 

인스턴스 필드의 초기화

객체가 만들어지는 시점에서 이루어집니다.

객체가 생성자에서 만들어지므로, 생성자 내에서 인스턴스 필드를 초기화 하는 것이 일반적!

 

초기값

public class Sample {
	//기본 초기값(인스턴스 변수)
	int a;
}
public class SampleMain {
	public static void main(String[] args) {
		Sample sam = new Sample();
		System.out.println("객체 생성 완료 : " + sam.a);
	}
}

@콘솔출력값
객체 생성 완료 : 0

Sample 객체 생성 후 a를 출력해보니, int형의 기본 값인 0이 출력 되는 것 알 수 있습니다.

 

명시적 초기화

public class Sample {
	//명시적 초기화
	int a = 100;
}
public class SampleMain {
	public static void main(String[] args) {
		Sample sam = new Sample();
		System.out.println("객체 생성 완료 : " + sam.a);
	}
}

@콘솔출력값
객체 생성 완료 : 100

 

초기화 블럭

public class Sample {
	int a = 100;
	
	//초기화 블럭
	{
		System.out.println("초기화 블럭 전 : " + a);
		a = 200;
		System.out.println("초기화 블럭 후 : " + a);
	}
}
public class SampleMain {
	public static void main(String[] args) {
		Sample sam = new Sample();
		System.out.println("객체 생성 완료 : " + sam.a);
	}
}

@콘솔출력값
초기화 블럭 전 : 100
초기화 블럭 후 : 200
객체 생성 완료 : 200

 

생성자

public class Sample {
	int a = 100;
	
	//초기화 블럭
	{
		System.out.println("초기화 블럭 전 : " + a);
		a = 200;
		System.out.println("초기화 블럭 후 : " + a);
	}
	
	//생성자
	public Sample() {
		System.out.println("생성자 전 : " + a);
		a = 300;
		System.out.println("생성자 후 : " + a);
	}
}
public class SampleMain {
	public static void main(String[] args) {
		Sample sam = new Sample();
		System.out.println("객체 생성 완료 : " + sam.a);
	}
}

@콘솔출력값
초기화 블럭 전 : 100
초기화 블럭 후 : 200
생성자 전 : 200
생성자 후 : 300
객체 생성 완료 : 300

☞ 클래스(static) 변수의 초기화 순서 (클래스 최초 사용 시)

① 타입 별 초기값 세팅

② 명시적 초기값 대입

③ 초기화 블럭에서 대입한 값

 

우선순위

(낮음) 초기값 → 명시적 초기값 → 초기화 블럭 (높음)

 

static 필드 초기화

객체 생성 이전에도 사용할 수 있어야 하므로 생성자가 호출되지 않은 상태에서도 초기화할 수 있어야 합니다.

생성자에서는 정적 필드를 초기화할 수 없음!

 

초기값

public class Sample {
	//클래스 변수
	static int b;
}
public class SampleMain {
	public static void main(String[] args) {
		Sample sam = new Sample();
        
		System.out.println("static 변수 확인 : " + Sample.b);
	}
}

@콘솔출력값
static 변수 확인 : 0

 

 

명시적 초기화

public class Sample {
	//클래스 변수
	static int b;
}
public class SampleMain {
	public static void main(String[] args) {
		Sample sam = new Sample();

		System.out.println("static 변수 확인 : " + Sample.b);
	}
}

@콘솔출력값
static 변수 확인 : 99

 

초기화 블럭

클래스가 로딩될 때 static block이 실행!!!

public class Sample {
	//클래스 변수
	static int b = 99;
	
	static {
		System.out.println("static 초기화 블럭 전 : " + b);
		b = 999;
		System.out.println("static 초기화 블럭 후 : " + b);
	}
}
public class SampleMain {
	public static void main(String[] args) {
		Sample sam = new Sample();

		System.out.println("static 변수 확인 : " + Sample.b);
	}
}

@콘솔출력값
static 초기화 블럭 전 : 99
static 초기화 블럭 후 : 999
static 변수 확인 : 999

 

클래스가 로딩될 때 static 초기화 블럭이 실행 되는 것을 확인할 수 있습니다.

public class Sample {
	//클래스 변수
	static int b;
	
	static {
		b = 999;
		System.out.println("클래스 로딩!");
	}
}
public class SampleMain {
	public static void main(String[] args) {
		Sample sam = new Sample();
		
		System.out.println("static 변수 확인 : " + Sample.b);
	}
}

@콘솔출력값
클래스 로딩!
static 변수 확인 : 999

클래스 로딩! 이 먼저 출력된 것을 확인할 수 있습니다.

따라서 복잡한 값 세팅이 있다면 static 초기화 블럭 안에서 수행하고 값 대입 하는 것이 좋겠죠?

LIST