본문 바로가기

Dev. Java

[자바 기본기] 변수의 초기화

1. 변수의 초기화

- 변수를 선언하고 처음으로 값을 저장하는 것
- 멤버변수 와 배열은 각 타입의 기본값으로 자동초기화되므로 초기화를 생략가능 
- 지역변수는 사용전에 꼭!!! 초기화를 해주어야한다.


Class InitTest   {
        int x;             // 인스턴스 변수
        int y = x;       // 인스턴스 변수

                void method1()   {

                       int i;              // 지역변수
                       int j = i;         // 컴파일 에러!!! 지역변수를 초기화 없이 사용했음.

        }

       }



2. 멤버변수의 초기화

  •  멤버변수의 초기화 방법
1. 명시적 초기화 ( explicit initialization)
      class Car  {

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


       2. 생성자 (constructor)

Car(String color , String gearType, int door)   {

             this.color  = color;
             this.gearType  = gearType;
             this.door  = door;

}


      3. 초기화 블럭 (initialization block)

- 인스턴스 초기화 블럭 : {}
- 클래스 초기화 블럭 : static {} 


3. 초기화 블럭 (initialization block)


  • 클래스 초기화 블럭 - 클래스변수의 복잡한 초기화에 사용되며 클래스가 로딩될 떄 실행된다.




  • 인스턴스 초기화 블럭 - 생성자에서 공통적으로 수행되는 작업에 사용되며,
인스턴스가 생성될 떄 마다 (생성자보다 먼저) 실행된다.


<덧붙임>

- 인스턴스 변수의 초기화는 주로 생성자를 사용하기 때문에, 인스턴스 초기화 블럭은 잘   사용되지 않음. 대신 클래스의 모든 생성자에서 공통적으로 수행되어져야 하는 코드가     있는 경우 인스턴스 초기화 블럭에 넣어 두면 코드의 중복을 줄일 수 있어서 좋다.



위와 같이, 클래스의 모든 생성자에 공통적으로 수행되어야 하는 문장들이 있을 때, 이 문장들을 모두 써 주기 보다 다음과 같이 인스턴스 블럭을 사용하면 코드가 간결해진다.





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


  • 클래스변수 초기화 시점 : 클래스가 처음 로딩될 떄 단 한번.

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


class InitTest   {

              static int cv = 1;         // 명시적 초기화
              int iv = 1;                   // 명시적 초기화

              static {       cv = 2;     }        // 클래스 초기화 블럭
              { iv = 2; }                            // 인스턴스 초기화 블럭

              InitTest()  {  // 생성자
                  iv = 3;
              }
       }


<덧붙임>



BlockTest가 실행되면서 메모리에 로딩될 때, 클래스 초기화 블럭이 가장 먼저 수행되어 "static { }"이 화면에 출력된다. 그 다음에 main메서드가 수행되어 BlockTest인스턴스가 생성되면서 인스턴스 초기화 블럭이 먼저 수행되고, 그 다음에 생성자가 수행된다. 

위의 실행결과에서도 알 수 있듯이 클래스 초기화 블럭은 처음 메모리에 로딩될 때 한번만 수행되었지만, 인스턴스 초기화 블럭은 인스턴스가 생성될 때 마다 수행되었다.






[참조] 1. http://choijava.blogspot.kr/2013/08/java_4061.html?view=sidebar

          2. http://gandus.tistory.com/154