자바의 정석 - 기초편

변수의 초기화, 멤버변수의 초기화

ODaram 2022. 8. 9. 15:14

변수의 초기화

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

 - 멤버변수 (iv, cv)는 자동 초기화된다. (초기화 되는 값은 타입 마다 다름)

초기화 되는 값
x, y 는 iv (자동초기화)
i, j는 lv (수동 초기화)

                                            > 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 {}, 생성자