변수의 초기화
🔎 변수의 초기화
지역변수(lv)는 수동 초기화 해야한다.
멤버변수(iv, cv)는 자동 초기화 된다.
class InitTest() {
int x; // 인스턴스 변수
int y = x; // 인스턴스 변수
void method1() {
int i; // 지역변수
int j = i; // 에러 -> 지역변수를 초기화하지 않고 사용
}
}
재사용 비번한 메모리 -> 여러 메서드가 번갈아 사용된다.
새로운 메소드가 올 때마다 0으로 초기화 하면 성능이 떨어진다.
🔎 멤버변수의 초기화
멤버변수의 초기화에는 다음과 같이 세 가지가 있다.
- 자동 초기화
- 간단 초기화 (=)
- 복잡 초기화 (초기화 블록, 생성자)
멤버변수의 초기화 지점은 다음과 같다.
▸ 클래스 변수의 초기화 시점 : 클래스가 처음으로 로딩될 때 단 한번.
▸ 인스턴스 변수 초기화 시점 : 인스턴스가 생성될 때 마다.
1. 명시적 초기화 (=)
대입 연산자(=)를 사용해서 초기화 하는 방법. (선언)
class car {
int door = 4; // 기본형(primitive type) 변수의 초기화
Engine e = new Engine(); // 참조형(rdference type) 변수의 초기화
// Engine e; 라고 하면 안된다.
}
참조형 변수는 아래와 같이 두 가지 값을 가질수 있다.
- null(기본값)
- 객체 주소
기본형 변수에 4를 선언해 주듯이, 참조형 변수에도 객체를 만들어 넣어줘야한다.
2. 초기화 블럭
복잡한 초기화할 때 사용한다. 여러 문장을 작성할 수 있다.
인스턴스 초기화 블럭 : {} → 잘 사용하지 않는다.
클래스 초기화 블럭 : static {}
class StaticBlockTest {
// 1. 명시적 초기화
static int[] arr = new int[10];
// 2. 클래스 초기화 블록
static {
for (int i=0, i<arr.length; i++) {
arr[i] = (int) (Math.random()*10)+1;
}
}
}
1번에서는 배열생성을 하였다. 명시적 초기화에서는 배열에 난수를 넣을 수 없다.
2번에서는 1번에서 생성한 arr에, 클래스 초기화 블록을 통해 난수를 넣을 수 있다.
3. 생성자(iv 초기화)
iv 초기화, 복잡한 초기화에 사용한다.
Car(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
📌 정리
클래스가 처음에 메모리에 올라갈 때 가장 먼저 CV가 초기화된 후 iv가 초기화 된다.
초기화 순서는 자동 > 간단 > 복잡 순으로 된다.
추가적으로 cv는 메모리에 올라갈 때 딱 한 번만 초기화 된다.