변수를 선언하고 처음으로 값을 저장하는 것을 '변수의 초기화'라고 한다. 멤버변수는 초기화를 하지 않아도 자동적으로 변수의 자료형에 맞는 기본값으로 초기화가 이루어지므로 초기화하지 않고 사용해도되지만, 지역변수는 사용하기 전에 반드시 초기화해야한다.
int x; //인스턴스 변수
int y = x; //인스턴스 변수
void method1(){
int i; //지역변수
int j = i; //에러. 지역변수를 초기화하지 않고 사용
}
멤버변수(클래스변수와 인스턴스변수)와 배열의 초기화는 선택적이지만, 지역변수의 초기화는 필수적이다.
각 타입의 기본값(default value)
자료형 | 기본값 |
---|---|
boolean | false |
char | '\u0000' |
byte, short, int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d 또는 0.0 |
참조형변수 | null |
멤버변수의 초기화방법
- 명시적 초기화방법(explicit initalization)
- 생성자(constructor)
- 초기화블럭(initialization block)
명시적 초기화방법(explicit initalization)
int door = 4; //기본형 변수의 초기화
Enfine e = new Engine(); //참조형 변수의 초기화
명시적 초기화를 하기 위해서는 초기화 블럭 또는 생성자를 사용해야한다.
초기화블럭(initialization block)
클래스 초기화 블럭 클래스 변수의 복잡한 초기화에서 사용된다.
인스턴스 초기화 블럭 인스턴스변수의 복잡한 초기화에 사용된다.
package object_oriented_programming;
public class BlockTest {
static { //클래스 초기화블럭
System.out.println("static { }");
}
{ //인스턴스 초기화블럭
System.out.println("{ }");
}
public BlockTest() {
System.out.println("생성자");
}
public static void main(String[] args) {
System.out.println("BlockTest bt = new BlockTest();");
BlockTest bt = new BlockTest();
System.out.println("BlockTest bt2 = new BlockTest();");
BlockTest bt2 = new BlockTest();
}
}
//결과
static { }
BlockTest bt = new BlockTest();
{ }
생성자
BlockTest bt2 = new BlockTest();
{ }
생성자
BlockTest가 메모리에 로딩될 때, 클래스 초기화 블럭이 가장 먼저 수행되어 'static { }'이 화면에 출력된다.
package object_oriented_programming;
public class StaticBlockTest {
static int[] arr = new int[10];
static {
for(int i=0; i<arr.length; i++) {
//1과 10 사이의 임의의 값을 배열 arr에 저장한다.
arr[i] = (int)(Math.random()*10)+1;
}
}
public static void main(String[] args) {
for(int i=0; i<arr.length; i++) {
System.out.println("arr["+i+"] : "+arr[i]);
}
}
}
//결과
arr[0] : 5
arr[1] : 4
arr[2] : 1
arr[3] : 2
arr[4] : 8
arr[5] : 10
arr[6] : 9
arr[7] : 3
arr[8] : 6
arr[9] : 9
명시적 초기화를 통해 배열을 생성하고 클래스 초기화 블럭을 이용해서 배열의 각 요소들을 random()을 사용해서 임의의 값으로 채우도록 했다.
멤버변수의 초기화 시기와 순서
클래스변수의 초기화 시점 클래스가 처음 로딩될 때 단 한번 초기화된다.
인스턴스변수의 초기화시점 인스턴스가 생성될 때 마다 각 인스턴스 별로 초기화가 이루어진다.
클래스변수의 초기화순서 기본값→명시적초기화→클래스 초기화 블럭
인스턴스변수의 초기화순서 기본값→명시적초기화→인스턴스 초기화 블럭 → 생성자
출처 : JAVA의 정석 - (남궁성지음)