본문 바로가기
멀티캠퍼스 풀스택 과정/Java의 정석

자바의 정석2-8 변수의 초기화, 멤버변수(iv,cv)의 초기화

by 이쟝 2021. 12. 31.

변수의 초기화 

- 지역변수(lv)는 수동 초기화해야 함(사용 전 꼭!!!)

- 메모리는 재사용이 빈번하기 때문에(특히 메서드 안의 지역변수들) 효율적으로 메모리를 사용하기 위해서 지역변수는  0으로 초기화 하지 않고 값 위에 새로운 값을 덮어쓴다 -> 초기화

- 인스턴스 변수는 지역변수보다는 유지기간이 그나마 길기 때문에 0으로 초기화 해도 됨

 

class InitTest {
	int x;        // 인스턴스 변수(iv)
	int y = x;    // 인스턴스 변수(iv)
	
	void method1() {
		int i;         // 지역변수
		int j = i;     // 에러. 지역변수를 초기화하지 않고 사용
	}
}

 

-> 멤버변수(iv,cv) 자동 초기화되고 method1의지역변수(lv)은 수동 초기화해야

- 자동 초기화되는 것은 자료형의 기본 타입으로 초기화됨!

 

* 각 타입의 기본값(default value)

자료형 기본값
Boolean false
char ‘\u0000’
byte, short, int 0
long 0L
float 0.0f
double 0.0d 또는 0.0
참조형 변수 null

멤버 변수(iv, cv)의 초기화

1) 명시적 초기화(간단 초기화)

- 대입연산자를 이용하여 초기화(선언 시)

- 변수를 선언하고 간단하고 쉬운 초기화 방법

 

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

-> 참조형 변수가 가질 수 있는 값은 null 아니면 객체주소

 

2) 블록 초기화 (복잡 초기화)

- 인스턴스 초기화 블록 : { 여러문장 } (iv초기화) -> 잘 사용 안 함

- 클래스 초기화 블록 : static {  }(static 메서드) (cv초기화)

- 복잡한 초기화에 사용함

 

3) 생성자(static) (복잡 초기화)

- iv초기화, 복잡한 초기화에 사용함


멤버 변수의 초기화 순서

-> 1) 자동 초기화 2) 간단 초기화(=) 3) 복잡 초기화( { }, static { }, 생성자)

- 보통 자동 초기화(기본값으로) -> 대입연산자를 사용해서 간단 초기화!

 

class StaticBlockTest {
	// cv 간단초기화
	static int[] arr = new int[10]; // 명시적 초기화(arr->cv) 간단한 초기화라서 배열 생성만 가능
	
	// cv 복잡초기화
	static { // 클래스 초기화 블럭 - 배열 arr을 난수로 채운다.
		for(int i=0; i<arr.length; i++) {
			arr[i] = (int)(Math.random()*10)+1;
		}
	}
}

 

클래스 변수 초기화 시점: 클래스가 처음 로딩될 때 한 번(메모리에 올라갈 때)

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

 

-> 초기화 순서는 cv(클래스 변수) 다음 iv(인스턴스 변수)

-> 자동 초기화(1, 4) -> 간단 초기화(2, 3) -> 복잡 초기화(5, 6, 7)

 

class InitTest {
	static int cv = 1;   // 명시적 초기화(간단) -> 2번
	int iv = 1;          // 명시적 초기화(간단)  -> 5번
	
	static { cv = 2; }  // 클래스 초기화 블럭(복잡) -> 3번
	{ iv = 2; }         // 인스턴스 초기화 블럭(복잡) -> 6번

	InitTest() {  // 생성자(복잡) -> 7번
		iv = 3;
	}
}