2022. 5. 23. 15:56ㆍJava
◎ 초기화 블럭
-> 초기화 블록의 종류로 "클래스 초기화 블럭"과 "인스턴스 초기화 블럭"이 있다.
-> 클래스 초기화 블럭 : 클래스 변수의 초기화에 사용된다. 인스턴스 초기화 블럭에 static을 붙인다.
-> 인스턴스 초기화 블럭 : 인스턴스 변수의 초기화에 사용된다. 클래스 내에 블럭{}을 만들고 그 안에 코드를 작성한다.
-> 클래스 초기화 블럭은 클래스가 메모리에 처음 로딩될 때 한번만 수행되고, 인스턴스 초기화 블럭은 생성자와 같이 인스턴스를 생성할 때 마다 수행된다.
-> 생성자 보다 인스턴스 초기화 블럭이 먼저 수행된다.
-> 예제
public class BlockEx {
// 클래스 초기화 블럭
static {
System.out.println("static initialization block");
}
// 인스턴스 초기화 블럭
{
System.out.println("instance initialization block");
}
public BlockEx() {
System.out.println("생성자");
}
public static void main(String[] args) {
System.out.println("BlockEx be = new BlockEx();");
BlockEx be = new BlockEx();
System.out.println("BlockEx be2 = new BlockEx()");
BlockEx be2 = new BlockEx();
}
}
-> 결과
☞ 결과를 보면 클래스 초기화 블럭이 가장 먼저 수행된다. 이후 main메서드, 인스턴스 초기화 블럭, 생성자 순으로 출력이 된다.
☞ 클래스 초기화 블럭은 클래스가 메모리에 처음 로딩될 때 한 번만 수행되기 때문에 두번째에서는 출력이 되지 않았고, 인스턴스 초기화 블럭은 인스턴스가 생성될 때 마다 수행되었다.
◎ 멤버변수의 초기화 시기, 순서
-> 클래스 변수의 초기화 시점 : 클래스가 처음 로딩도리 때 한번 초기화 된다.
-> 인스턴스 변수의 초기화 시점 : 인스턴스가 생성될 때 마다 인스턴스별로 초기화 된다.
-> 클래스 변수의 초기화 순서 : 기본값 → 명시적 초기화 → 클래스 초기화 블럭
-> 인스턴스 변수의 초기화 순서 : 기본값 → 명시적 초기화 → 인스턴스 초기화 블럭 → 생성자
-> 예제
class Entrance{
static int count = 0; // 생성된 인스턴스의 수를 저장하기 위한 변수
int number; // 인스턴스 고유 번호
{
++count;
number = count;
}
}
public class initializationEx {
public static void main(String[] args) {
Entrance e1 = new Entrance();
Entrance e2 = new Entrance();
Entrance e3 = new Entrance();
System.out.println(e1.number + "번 손님 입장");
System.out.println(e2.number + "번 손님 입장");
System.out.println(e3.number + "번 손님 입장");
System.out.println("총 입장객은 " + Entrance.count + "명 입니다.");
}
}
-> 결과
☞ Entrance 클래스의 인스턴스를 생성할 때 마다 인스턴스 블럭이 수행되어 클래스 변수 count를 1증가시키고 인스턴스 변수 number에 저장한다.
★ 참고 및 출처
자바의 정석