클래스의 멤버 변수의 초기화 방법에는 3가지 종류가 있다.
- 명시적 초기화(Explicit initialization)
- 생성자(Constructor)
- 초기화 블럭(Initialization block)
- 인스턴스 초기화 블럭
- 클래스 초기화 블럭
1. 명시적 초기화(Explicit initialization)
변수를 선언과 동시에 초기화 하는 방법
class Car
{
int door = 4;
Engine e = new Engine();
}
2. 생성자(Constructor)
class Car
{
int door;
Engine e;
Car()
{
door = 4;
e = new Engine();
}
}
3. 초기화 블럭(Initialization block)
- 클래스 초기화 블럭: 클래스변수의 복잡한 초기화에 사용된다.
- 인스턴스 초기화 블럭: 인스턴스변수의 복잡한 초기화에 사용된다.
class Car
{
static int count;
static int[] randArr = new int[10];
int serialNo;
int door;
String color;
static
{
count = 0;
//명시적 초기화로는 어려운 초기화를 초기화 블럭에서 해줌
for (int i = 0; i < randArr.length; i++)
randArr[i] = (int)(Math.random() * 10) + 1;
}
//모든 생성자에서 공통으로 사용되는 코드를 따로 빼서 인스턴스 초기화 블럭으로 만듦
{
count++;
serialNo = count;
//초기화 블럭에서는 조건문, 반복문, 예외처리구문 등을 자유롭게 사용 가능
//생성자에서 공통적으로 배열을 초기화하는 등의 경우에 사용하면 유용하다
if (count > 10)
System.out.println("차가 너무 많아요!");
}
Car()
{
this(4, "White");
}
Car(int door, String color)
{
this.door = door;
this.color = color;
}
}
초기화 블럭 내에서는 조건문, 반목문, 예외처리구문 등을 자유롭게 사용할 수 있다.
클래스 초기화 블럭은 JVM에 의해 클래스가 메모리에 로딩될 때 단 한번만 실행된다. 클래스 변수를 명시적 초기화 만으로는 초기화하기 어려울 때 사용하면 유용하다.
인스턴스 초기화 블럭의 경우 인스턴스를 만들 때 생성자와 함께 실행되므로(정확히는 생성자보다 먼저 실행된다) 여러 생성자에 공통적으로 들어가는 초기화 코드를 초기화 블럭에 넣어줌으로써 코드를 간결하게 만들 수 있다.
4. 멤버변수의 초기화 시기와 순서
초기화 시점
클래스변수: 클래스가 처음 로딩될 때 단 한번 초기화 된다. 프로그램 실행 도중 클래스에 대한 정보가 요구될 때(클래스 멤버 사용, 인스턴스 생성 등) 메모리에 로딩된다.
인스턴스변수: 인스턴스가 생성될 때마다 각 인스턴스별로 초기화
초기화순서
클래스변수: Default값 -> 명시적 초기화 -> 초기화 블럭
인스턴스변수: Default값 -> 명시적 초기화 -> 초기화 블럭 -> 생성자
'Java' 카테고리의 다른 글
[Java] 람다식(Lambda Expression) (0) | 2022.10.12 |
---|---|
Exception 관련 클래스의 계층 구조 (Unchecked Exception/Checked Exception) (0) | 2022.03.31 |
[소소한 정보] this와 this() (0) | 2022.01.20 |
[소소한 정보] 가변 인자 (Variable arguments) (0) | 2022.01.20 |
[소소한 정보] 컴파일러의 리터럴 연산, 길이가 0인 배열 (0) | 2022.01.18 |
댓글