변수의 초기화


🔎 변수의 초기화

지역변수(lv)는 수동 초기화 해야한다.

멤버변수(iv, cv)는 자동 초기화 된다.

class InitTest() {
	int x;				// 인스턴스 변수
	int y = x;			// 인스턴스 변수

	void method1() {
		int i;			// 지역변수
		int j = i;		// 에러 -> 지역변수를 초기화하지 않고 사용	
	}
}

재사용 비번한 메모리 -> 여러 메서드가 번갈아 사용된다.

새로운 메소드가 올 때마다 0으로 초기화 하면 성능이 떨어진다.



🔎 멤버변수의 초기화

멤버변수의 초기화에는 다음과 같이 세 가지가 있다.

  1. 자동 초기화
  2. 간단 초기화 (=)
  3. 복잡 초기화 (초기화 블록, 생성자)


멤버변수의 초기화 지점은 다음과 같다.

▸ 클래스 변수의 초기화 시점 : 클래스가 처음으로 로딩될 때 단 한번.

▸ 인스턴스 변수 초기화 시점 : 인스턴스가 생성될 때 마다.


1. 명시적 초기화 (=)

대입 연산자(=)를 사용해서 초기화 하는 방법. (선언)

class car {
	int door = 4;				// 기본형(primitive type) 변수의 초기화
	Engine e = new Engine();	// 참조형(rdference type) 변수의 초기화

	// Engine e; 라고 하면 안된다.
}

참조형 변수는 아래와 같이 두 가지 값을 가질수 있다.

  • null(기본값)
  • 객체 주소

기본형 변수에 4를 선언해 주듯이, 참조형 변수에도 객체를 만들어 넣어줘야한다.


2. 초기화 블럭

복잡한 초기화할 때 사용한다. 여러 문장을 작성할 수 있다.

  • 인스턴스 초기화 블럭 : {} → 잘 사용하지 않는다.

  • 클래스 초기화 블럭 : static {}

class StaticBlockTest {
	// 1. 명시적 초기화
	static int[] arr = new int[10];

	// 2. 클래스 초기화 블록
	static {
		for (int i=0, i<arr.length; i++) {
			arr[i] = (int) (Math.random()*10)+1;
		} 
	}
}

1번에서는 배열생성을 하였다. 명시적 초기화에서는 배열에 난수를 넣을 수 없다.

2번에서는 1번에서 생성한 arr에, 클래스 초기화 블록을 통해 난수를 넣을 수 있다.


3. 생성자(iv 초기화)

iv 초기화, 복잡한 초기화에 사용한다.

Car(String color, String gearType, int door) {
	this.color = color;
	this.gearType = gearType;
	this.door = door;
}

📌 정리

클래스가 처음에 메모리에 올라갈 때 가장 먼저 CV가 초기화된 후 iv가 초기화 된다.

초기화 순서는 자동 > 간단 > 복잡 순으로 된다.

추가적으로 cv는 메모리에 올라갈 때 딱 한 번만 초기화 된다.