충분히 쌓여가는
변수의 초기화 본문
멤버변수(iv, cv)는 자동 초기화됨
지역변수(lv)는 수동 초기화 해야됨
class InitTest{
int x; // iv
int y = x; // iv
void method1() {
int; // lv
int j = i; // 에러: 지역변수를 초기화하지 않았기 때문
}
}
수정된 코드
class InitTest{
int x; // iv
int y = x; // iv
void method1() {
int = 0 ; // lv, 어떤 값이든 넣어 초기화 시켜줌
int j = i; // 에러: 지역변수를 초기화하지 않았기 때문
}
}
멤버변수(iv, cv)의 초기화
1. 명시적 초기화(=) (간단 초기화)
대입 연산자 = 사용
class Car {
int door = 4; // 기본형 변수의 초기화
Engine e = new Engine(); // 참조형 변수의 초기화
}
2. 초기화 블럭(cv 초기화) (복잡 초기화)
iv -> 인스턴스 초기화 블럭: {} 거의 사용하지 않는다
cv -> 클래스 초기화 블럭: static {}
3. 생성자(iv 초기화) (복잡 초기화)
Car(String color, String gearType, int door) { // 매개변수 있는 생성자
this.color = color;
this.gearType = gearType;
this.door = door;
}
cv, iv 초기화 종류
- 자동 초기화
- 0과 같이 자동으로 초기화됨
- 간단 초기화
- 대입 연산자 = 사용
- 복잡 초기화
- static block{} 사용 -> cv 초기화
- 생성자 사용 -> iv 초기화
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;
}
}
정리
초기화 순서
1. cv -> iv (cv 초기화 된 후 iv 초기화)
2. 자동 초기화(0) -> 간단 초기화(=) -> 복잡 초기화(static{}, 생성자)
'Java > 객체지향' 카테고리의 다른 글
포함(Composite) 관계 (0) | 2023.06.04 |
---|---|
상속(Inheritance) (0) | 2023.06.04 |
생성자 this()와 참조변수 this (0) | 2023.06.01 |
생성자 Constructor (0) | 2023.06.01 |
오버로딩 overloading (0) | 2023.05.30 |