이 글은 남궁성님의 자바의 정석 3/e를 기반으로 공부한 내용을 정리한 글입니다.
변수를 선언하고 처음으로 값을 저장하는 것을 '변수의 초기화'라고 한다.
class InitTest {
int x; // 인스턴스변수
int y = x; //인스턴스변수
void method1(){
int i; // 지역변수 (초기화 꼭 필요!!)
int j = i; // 에러. 지역변수를 초기화하지 않고 사용
}
}
멤버변수는 초기화를 하지 않아도 자동으로 변수의 자료형에 맞는 기본값으로 초기화가 이루어진다.
지역변수는 자동으로 초기화가 이루어지지 않는다. 따라서 초기화 되지 않은 상태에서 변수 j를 초기화 하는데 사용할 수 없다.
변수를 선언과 동시에 초기화하는 것
class Car {
int door = 4; // 기본형 변수의 초기화
Engine e = new Engine(); // 참조형 변수의 초기화
}
클래스 초기화 블럭 클래스변수의 복잡한 초기화에 사용된다.
인스턴스 초기화 블럭 인스턴스변수의 복잡한 초기화에 사용된다.
class InitBlock {
static { /* 클래스 초기화 블럭 */ }
{ /* 인스턴스 초기화 블럭 */ }
// ...
}
Car() {
count++;
serialNo = count; ------> 같은 코드 중복
color = "white";
gearType = "auto";
}
Car(String color, String gearType) {
count++;
serialNo = count; ------> 같은 코드 중복
this.color = color;
this.gearType = gearType;
}
인스턴스 변수의 초기화는 주로 생성자를 사용하고, 인스턴스 초기화 블럭은 모든 생성자에서 공통으로 수행돼야 하는 코드를 넣는데 사용한다.
// 리팩토링
{
count++;
searialNo = count;
}
Car() {
color = "white";
gearType = "auto";
}
Car(String color, String gearType) {
this.color = color;
this.gearType = gearType;
}
클래스가 처음 로딩될 때 단 한번 초기화 된다.
인스턴스가 생성될 때마다 각 인스턴스별로 초기화가 이루어진다.
기본값 -> 명시적초기화 -> 클래스 초기화 블럭
기본값 -> 명시적초기화 -> 인스턴스 초기화 블럭 -> 생성자
class InitTest {
static int cv = 1;
int iv = 1;
static { cv = 2; }
{ iv = 2; }
InitTest() {
iv = 3;
}
}
클래스변수는 항상 인스턴스변수보다 먼저 생성되고 초기화 된다.
변수와 메서드 - https://blog.daum.net/gunsu0j/44