변수의 초기화
: 변수를 선언하고 처음으로 값을 저장하는 것class InitTest {
int x; //인스턴스 변수 (선언만 하고 초기화 하지 않음)
int y = x; //인스턴스 변수 (y초기화 하는데 x사용)
→인스턴스 변수 x는 초기화 해주지 않아도 자동적으로 int형의 기본값인 0으로 초기화 되므로,
'int y = x;'와 같이 사용 가능
x의 값이 0이므로 y역시 0이 저장됨
void method1() {
int i; //지역변수 (선언만 하고 초기화 하지 않음)
int j = i; //에러. j초기화 하는데 i사용. 지역변수를 초기화하지 않고 사용
→method1()의 지역변수 i는 자동적으로 초기화 되지 않으므로,
초기화 되지 않은 상태에서 변수 j를 초기화하는데 사용할 수 없음(컴파일시 에러)
}
}
🎃 각 타입의 기본값(default value)
자료형 | 기본값 |
---|---|
boolean | false |
char | `\u0000' |
byte, short, int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d 또는 0.0 |
참조형 | null |
🎨 멤버변수의 초기화 순서
- 클래스변수(cv) 초기화 → 인스턴스 변수(iv) 초기화
- 자동초기화 → 명시적 초기화(간단) → 초기화 블럭, 생성자(복잡)
class Car {
int door = 4; //기본형(primitive type)변수의 초기화
Engine e = new Engine(); //참조형(reference type)변수의 초기화
//...
}
클래스 초기화 블럭
: 클래스 변수의 복잡한 초기화에 사용static
을 붙임인스턴스 초기화 블럭
: 인스턴스변수의 복잡한 초기화에 사용블럭{ }
만들고 그 안에 코드 작성Ex6_14이 메모리에 로딩될 때, 클래스 초기화 블럭이 가장 먼저 수행되어 'static{}'이 화면에 출력. 그 다음에 main메서드가 수행되어 Ex6_14의 인스턴스가 생성되면서 인스턴스 초기화 블럭이 먼저 수행되고, 끝으로 생성자가 수행
▶ 클래스 초기화 블럭은 처음 메모리에 로딩될 때 한번만 수행
▶ 인스턴스 초기화 블럭은 인스턴스가 생성될 때 마다 수행
명시적 초기화를 통해 배열 arr을 생성하고, 클래스 초기화 블럭을 이용해서 배열의 각 요소들을 random()을 사용해서 임의의 값으로 채우도록 함
▶배열이나 예외처리가 필요한 초기화에서는 명시적 초기화만으로는 복잡한 초기화 작업 불가. 추가적으로 클래스 초기화 블럭을 사용하도록 함