변수의 초기화
지역변수(lv)는 수동 초기화 해야함(사용전에 꼭 직접 초기화해줘야 한다.)
멤버변수(iv,cv)는 자동초기화 된다.

자동초기화시 기본값
boolean false
char '\u0000'
byte,short,int 0
long 0L
float 0.0f
double 0.0d 또는 0.0
참조형 null

멤버변수(iv,cv)의 초기화
1.자동초기화: 0으로 자동초기화
2.간단초기화: 대입연산자(=) 사용
3.복잡초기화:
iv - 생성자메서드, { } (그냥 블럭은 잘 안쓰임)
cv - static{ }

초기화시점
클래스변수(cv) : 클래스가 처음 로딩될때 한번!
인스턴스변수(iv) : 인스턴스(객체)가 생성될때마다

class InitTest{
        int x;//x는 iv라서 자동초기화(x=0) 됐으니까 사용가능
        int y = x;
	
	void method1(){
		int i;
		/*lv는 재사용이 빈번해서 0으로 초기화하지 않고
		메서드 사용할때마다 값을 덮어쓴다.
		그래서 사용전에 매번 수동초기화 해줘야한다. */
	//	int j = i; 에러! 지역변수를 초기화하지 않고 사용해서
	}
}
    class Car{
        //2.간단초기화(명시적 초기화)
        int door = 4; //기본형 변수의 초기화
        Engine e = new Engine();//참조형 변수의 초기화
        //그냥 Engine e; 이렇게 쓰면 참조변수에 null값 들어가 있다. 이건 아무것도 아님.
        //그래서 Engine e = new Engine() 객체생성해서 객체의 주소를 참조변수 e에 담아줘야함.
        //그것이 참조변수의 초기화.
    }

class StaicBlockTest{

    static int[] arr = new int[10]; //명시적 초기화

    //int배열을 0으로 간단초기화했다.
    //그런데 int배열을 1~10사이의 난수로 초기화하고 싶으면 간단초기화로 불가능
    //static{ } 사용해서 복잡초기화해줘야 한다.

    static { //static{ }을 이용한 cv 복잡초기화
        for(int i=0;i<arr.length;i++) {
            arr[i] = (int)(Math.random()*10)+1;
        }
    }
}

class InitTest2{
    static int cv = 1; //간단초기화
    int iv = 1; //간단초기화

    static {   cv=2;   } //cv복잡초기화
    {   iv=2;   } //iv복잡초기화

    InitTest2(){//iv복잡초기화
        iv = 3;
    }
} 

초기화순서
1.cv -> iv
2.자동 -> 간단 -> 복잡

InitTest2 클래스 객체생성을 한다면
InitTest2 it = new InitTest2();

1.cv초기화
자동초기화 cv=0; -> 간단초기화 cv=1; -> 복잡초기화 cv=2;
2.iv초기화
자동초기화 iv=0; -> 간단초기화 iv=1; -> 복잡초기화 cv=2; -> 복잡초기화 iv=3;

profile
공부하고 기록하는 블로그

0개의 댓글