본문 바로가기
Java/Basic

변수의 초기화

by 최로이 2021. 3. 23.

1. 변수의 초기화?

변수를 선언하고 처음으로 값을 저장하는 것을 '변수의 초기화'라고 한다. 변수의 초기화는 경우에 따라 선택적이거나 필수적이기도 하지만, 가능하면 선언과 동시에 초기화하는 것이 좋다. 그 이유는 멤버변수는 초기화하지 않아도 자동적으로 변수의 자료형에 맞는 기본값으로 초기화가 이루어지지만, 지역변수는 사용하기 전에 반드시 초기화를 해야 하기 때문이다.

 

멤버변수(클래스변수, 인스턴스변수)와 배열의 초기화는 선택적이지만, 지역변수의 초기화는 필수적이다.

2. 멤버변수의 초기화 방법

1) 명시적 초기화

2) 생성자

3) 초기화 블럭

  -인스턴스 초기화 블럭 : 인스턴스변수를 초기화하는 데 사용.

  -클래스 초기화 블럭: 인스턴스변수를 초기화 하는데 사용.

 

2.1 명시적 초기화(explicit initialization)

  변수를 선언과 동시에 초기화 하는 방법을 명시적 초기화라고 한다. 가장 기본적이면서도 간단한 초기화 방법으로 여러 초기화 방법 중에서 가장 우선적으로 고려되어야 한다.

  명시적 초기화가 간단하고 명료하지만, 보다 복잡한 초기화 작업이 필요할 때는 초기화 블럭 또는 생성자를 사용해야 한다.

class Car {
  int door = 4; //기본형 변수의 초기화
  Engine e = new Engine(); //참조형 변수의 초기화
}

 

2.2 초기화 블럭(initialization)

  초기화 블럭에는 클래스 초기화 블럭과 인스턴스 초기화 블럭 두 가지 종류가 있다. 말그대로 클래스 초기화 블럭은 클래스 변수의 초기화에, 인스턴스 초기화 블럭은 인스턴스 변수의 초기화에 사용된다.

클래스 초기화 블럭 : 클래스변수의 복잡한 초기화에 사용된다. → static{ }
인스턴스 초기화 블럭 : 인스턴스변수의 복잡한 초기화에 사용된다. → { }

예제)

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 { }이 출력.

  -초기화 블럭은 처음 메모리에 로딩될 때 한번 수행되었지만, 인스턴스 초기화 블럭은 생성될 때마다 수행되었다.

② main 메소드가 수행되어 BlockTest 인스턴스 생성

③ 인스턴스가 생성되면서 인스턴스 초기화 블럭이 먼저 수행되고, 그다음에 생성자가 수행된다.

인스턴스변수의 복잡한 초기화는 생성자 또는 인스턴스 초기화 블럭을 사용한다.

 

2.3 멤버변수의 초기화 시기와 순서

1) 클래스 초기화 시점: 클래스가 처음 로딩될 때 단 한번.

2) 인스턴스변수와 초기화 시점: 인스턴스가 생성될 때마다 각 인스턴스별로 초기화

3) 클래스변수의 초기화 순서: 기본값 → 명시적 초기화 → 클래스 초기화 블럭

4) 인스턴스변수의 초기화 순서: 기본값 → 명시적초기화 → 인스턴스 초기화블럭 → 생성자

 

예제)

public class InitTest {
	static int cv = 1;	//명시적 초기화1
				int iv = 1;	//명시적 초기화2
				
	static { cv = 2; }	//클래스 초기화 블럭
	
				{ iv =2; }		//인스턴스 초기화 블럭
				
				InitTest(){	//생성자
					iv=3;
				}
}

예제에 따른 데이터 처리 순서

① cv가 메모리(method area)에 생성되고 , cv에는 int형의 기본값인 0이 cv에 저장된다.

② 그 후 명시적 초기화 (int cv = 1)에 의해 cv에 1이 저장된다.

③ 마지막으로 클래스 초기화 블럭(cv=2)이 수행되어 cv에는 2가 저장된다.

④ InitTest클래스의 인스턴스가 생성되면서 iv가 메모리(heap)에 존재하게 된다.

⑤ 명시적 초기화에 의해 iv에 1이 저장된다.

⑥ 인스턴스 초기화 블럭이 수행되어 iv에 2가 저장된다.

⑦ 마지막으로 생성자가 수행되어 iv에 3이 저장된다.

'Java > Basic' 카테고리의 다른 글

오버로딩과 오버라이딩  (0) 2021.03.25
상속(Inheritance)  (0) 2021.03.24
생성자(Constructor)  (0) 2021.03.23
클래스 메소드와 인스턴스 메소드  (1) 2021.03.19
기본형 매개변수, 참조형 매개변수  (0) 2021.03.19

댓글