6-38~41 변수 초기화, 멤버변수 초기화

oyeon·2020년 12월 23일
0

(완)객체지향 개념

목록 보기
16/37

변수의 초기화

  • 멤버변수(iv, cv)는 자동 초기화된다.(타입마다 다르지만 보통 0으로 초기화)
  • 지역변수(lv)는 수동 초기화 해야함(사용전에 반드시!!!)
    why? 메서드는 재사용이 빈번하다. 지역변수는 메서드가 호출되어 작업하는 동안만 존재하기 때문에 생명주기가 짧다. 그런데 메서드를 호출할 때마다 메모리 공간을 0으로 초기화 하면 성능이 떨어짐. 성능 향상을 위해 새로운 값으로 덮어쓰는 방식으로 초기화 한다.
class InitTest{
    int x;	// 인스턴스 변수
    int y = x;	//인스턴스 변수
    
    void method1(){
    	int i;		// 지역변수
        int j = i;	// Error!! 지역변수를 초기화하지 않고 사용
    }
}

멤버변수의 초기화

  1. 명시적 초기화(=) : 간단 초기화
class Car{
   int door = 4;		// 기본형(primitive type) 변수의 초기화
    Engine e = new Engine();	// 참조형(reference type) 변수의 초기화
}
  1. 초기화 블럭 : 복잡 초기화
  • 인스턴스 초기화 블럭 : { }
  • 클래스 초기화 블럭 : static { }
  1. 생성자 : 복잡 초기화

정리
1. 자동 초기화 (cv, iv 초기화)
2. 간단 초기화 (=)
3. 복잡 초기화 : cv의 경우 static { }, iv의 경우 생성자

cv 복잡 초기화 static { } 예시

class StaticBlockTest{
    static int[] arr = new int[10];	// 명시적 초기화
    static {	// 클래스 초기화 블럭 - 배열 arr을 난수로 채운다.
    	for(int i = 0; i < arr.length; i++){
            arr[i] = (int)(Math.random()*10) + 1;
        }
    }
}

초기화 순서

  • 클래스 변수 초기화 시점 : 클래스가 처음 로딩될 때 단 한번
  • 인스턴스 변수 초기화 시점 : 인스턴스가 생성될 때 마다
class InitTest{
    static int cv = 1;	// 명시적 초기화
    int iv = 1;		// 명시적 초기화
    
    static { cv = 2; }	// 클래스 초기화 블럭
    { iv = 2; }		// 인스턴스 초기화 블럭
    
    InitTest() {	// 생성자
    	iv = 3;
    }
}
InitTest it = new InitTest();
  1. cv -> iv
  2. 자동(0) -> 간단(=) -> 복잡(static {}, 생성자)
profile
Enjoy to study

0개의 댓글