아래의 코드와 같이 static { } 혹은 { } 블록을 종종 볼 수 있다.
이러한 블록들은 초기화 블럭(initialization block)이라고 하고 클래스 초기화 블럭, 인스턴스 초기화 블럭으로 나뉜다.
class BlockTest{
static { // 클래스 초기화 블럭
System.out.println("static { }");
}
{ // 인스턴스 초기화 블럭
System.out.println("{ }");
}
public BlockTest(){
System.out.println("생성자");
}
public static void main(String args[]){
System.out.println("BlockTest bt = new BlockTest(); ");
BlockTest bt = new BlockTest();
System.out.println("BlockTset bt2 = new BlockTest();");
BlockTest b2 = new BlockTest();
}
}
클래스 초기화 블록
class BlockTest {
public static Map<String, String> classMap;
// 클래스 초기화 블럭
static {
map = new HashMap<>();
map.put("foo","bar");
}
public static void main(String[] args) {
Test.map.keySet().forEach(System.out::println); // foo
}
}
클래스 초기화 블록은 생성자나 인스턴스 초기화 블록으로는 수행할 수 없는 클래스 변수의 복잡한 초기화에 사용되고
클래스가 처음으로 메모리에 로딩될 때 단 한 번만 실행된다.
인스턴스 초기화 블록
class BlockTest {
public String name;
{
name = "hongjae";
}
public static void main(String[] args) {
Test test = new Test();
System.out.println(test.name); // hongjae
}
}
인스턴스 초기화 블록은 인스턴스 변수의 복잡한 초기화에 사용되고 인스턴스가 생성될 때 마다 "생성자보다 먼저" 수행된다.
인스턴스 변수의 초기화는 주로 생성자를 사용하기 때문에, 인스턴스 초기화 블럭은 잘 사용되지 않는데
대신 생성자 오버로딩으로 인해 여러 생성자에서 공통적으로 수행되어져야 하는 코드가 있는 경우
생성자에 넣지 않고 인스턴스 초기화 블럭에 넣어 두면 코드의 중복을 줄일 수 있어서 좋다.
class BlockTest {
private String name;
public BlockTest() {
System.out.println("BlockTest 인스턴스 생성");
}
public BlockTest(String name) {
System.out.println("BlockTest 인스턴스 생성");
this.name = name;
}
}
위와 같이 생성자마다 중복되는 System.out.println("BlockTest 인스턴스 생성"); 코드를 인스턴스 블록을 사용하여
class BlockTest {
private String name;
{
System.out.println("BlockTest 인스턴스 생성");
}
public BlockTest() {
}
public BlockTest(String name) {
this.name = name;
}
}
초기화 순서
1. 클래스 변수 : 기본값(0 or null 등등) → 명시적 초기화 → 클래스 초기화 블록
2. 인스턴스 변수 : 기본값(0 or null 등등) → 명시적 초기화 → 인스턴스 초기화 블록 → 생성자
class BlockTest{
public static String name = "hongjae"; // 명시적 초기화
public int age = 10; // 명시적 초기화
static { // 클래스 초기화 블럭
System.out.println(name);
name = "jaehong";
System.out.println(name);
}
{ // 인스턴스 초기화 블럭
System.out.println(age);
age = 100;
System.out.println(age);
}
public BlockTest(){ // 생성자 초기화
age = 1000;
System.out.println(age);
}
public static void main(String args[]){
BlockTest blockTest = new BlockTest();
}
}
출력 결과
// hongjae
// jaehong
// 10
// 100
// 1000
Comments