변수의 초기화, 멤버변수의 초기화
변수의 초기화
- 지역변수 (lv)는 수동 초기화 해야함 (사용전 꼭!!!)
- 멤버변수 (iv, cv)는 자동 초기화된다. (초기화 되는 값은 타입 마다 다름)



> int j = i; 를 하려고 할때 i의 값이 뭔지 모르기 때문에 이슈 발생
>> 왜 모르나?

- 호출 스택이 (계속 쌓였다 없어졌다) 재사용이 빈번한 메모리
- 메서드가 호출 될 때마다 공간을 0으로 초기화 하면 성능이 떨여져,
새로운 값으로 덮어쓰는 방식을 사용함 (=초기화)
- 그렇기 때문에 값을 모름
멤버변수의 초기화 (iv, cv)
1. 명시적 초기화 (=) (대입연산자) (선언식)
class Car {
int door = 4; // 기본형 (primitive type) 변수의 초기화
Engine e= new Engine // 참조형 (reference type) 변수의 초기화
// Engine e; -> e는 null 값
}
2. 초기화 블럭 (-> 복잡한 초기화에 사용)
(iv에 사용) - 인스턴스 초기화 블럭 : {여러 문장 넣기}
(cv에 사용) - 클래스 초기화 블럭 : static {}
3. 생성자 (-> iv 초기화, 복잡한 초기화에 사용)
Car(String color, String gearType, int door) { // 매개변수 있는 생성자
this.color = color;
this.gearType = gearType;
this.door = door;
}
// 정리 //
cv, iv 초기화
1. 자동초기화 - 0
2. 간단초기화 - =
3. 복잡초기화 - {}, (cv에 사용)static {}, (iv에 사용)생성자 // {}는 잘 사용 하지 않음
멤버변수의 초기화 - static {}
Class StaticBlockTest {
static int [] arr = new int[10]; // 명시적 초기화 (간단 초기화)
static { // 클래스 초기화 블럭 - 배열 arr을 난수로 채운다 (cv 복잡 초기화)
for ( int i=0; i<arr.length; i++ ) {
arr [i] = (int) (Math.random() * 10) +1;
}
}
}
멤버변수의 초기화
> 클래스 변수(cv) 초기화 시점 : 클래스가 처음 로딩될 때 (= 메모리에 올라갈때) 단 한번
> 인스턴스 변수(iv) 초기화 시점 : 인스턴스가 생성될 때 마다 (= 객체를 만들 때 마다)


초기화 순서
1. cv -> iv
2. 자동 -> 간단 -> 복잡
0 = static {}, 생성자