변수의 초기화
멤버변수는 초기화를 하지 않아도 자동적으로 변수의 자료형에 맞는 기본값으로 초기화가 이루어지므로 초기화하지 않고 사용해도 되지만, 지역변수는 사용하지 전에 반드시 초기화해야 한다.
*각 타입의 기본값
자료형 | 기본값 |
boolean | false |
char | '\u000' |
byte, short, int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d 또는 0.0 |
참조형 변수 | null |
String | null |
멤버변수의 초기화 방법
1. 명시적 초기화
변수를 선언과 동시에 초기화하는 것을 명시적 초기화라고 한다.
class Car {
int door = 4; // 기본형(primitive type) 변수의 초기화
Engine e = new Engine(); // 참조형(reference type) 변수의 초기화
}
명시적 초기화가 간단하고 명료하긴 하지만, 보다 복잡한 초기화 작업이 필요할 때는 '초기화 블럭(initialization block)' 또는 '생성자'를 사용해야 한다.
2. 초기화 블럭
- 클래스 초기화 블럭 : 클래스가 메모리에 처음 로딩될 때 한 번만 수행
- 인스턴스 초기화 블럭 : 생성자와 같이 인스턴스를 생성할 때 마다 수행
- 생성자보다 인스턴스 초기화 블럭이 먼저 수행된다는 사실!
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++; // 인스턴스 초기화 블럭
serialNo = count; //
}
Car(){
color = "White";
gearType = "Auto";
}
Car(String color, String gearType){
this.color = color;
this.gearType = gearType;
}
멤버변수의 초기화 시기와 순서
- 클래스 변수의 초기화 시점 : 클래스가 처음 로딩될 때 단 한 번 초기화 된다.
- 인스턴스 변수의 초기화 시점 : 인스턴스가 생성될 때마다 각 인스턴스 별로 초기화가 이루어진다.
- 클래스 변수의 초기화 순서 기본값 -> 명시적 초기화 -> 클래스 초기화 블럭
- 인스턴스 변수의 초기화 순서 기본값 -> 명시적 초기화 -> 인스턴스 초기화 블럭 -> 생성자
아래 코드에서 클래스(cv)초기화와 인스턴스(iv) 초기화가 어떤 순서로 되는지 생각해보자!
class InitTest{
static int cv = 1;
int iv = 1;
static { cv=2; } // 클래스 초기화 블럭
{ iv = 2; } // 인스턴스 초기화 블럭
InitTest() { // 생성자
iv = 3;
}
}
[참고]
Java의 정석 3판 (남궁성 저)
'공부 > 자바' 카테고리의 다른 글
오버라이딩(overriding) (0) | 2024.05.31 |
---|---|
상속 & 클래스 간의 관계 (0) | 2024.05.30 |
생성자(Constructor) (0) | 2024.05.29 |
오버로딩(overloading) (0) | 2024.05.29 |
객체 지향 프로그래밍(OOP) (0) | 2024.05.28 |