Java의 정적 초기자(static initializer)에 대해서 살펴보고자 한다. 

다음과 같은 코드가 있을 때 static { ... }으로 감싸줘 있는 부분을 static initializer라고 한다. 


Oralcle 공식 문서를 보면 "이 정적 초기자 block은 클래스 body 어디에서 나타나도 되며 하나의 클래스가 임의의 갯수의 static initialization block(정적 초기자)를 가질수 있다"고 되어 있다.


그리고 정적 초기자 영역의 코드는 단 한번만 실행되는데 그 실행시점은 

-. 해당 클래스의 객체를 생성할때

-. 해당 클래스의 static 멤버(변수 혹은 메소드)에 최초로 접근할 때 한번 실행이 된다. 이 경우는 심지어 해당 클래스의 객체를 생성하지 않았을 지라도 해당 클래스의 멤버에 최초 접근시 정적 초기자가 실행이 된다.


또한 정적 초기자는 생성자 이전에 실행이 된다.

아래 코드는 확장자를 넘겨 주었을 때 해당 확장자가 어떤 MIME 타입인지를 반환해주는 코드이다. 이때 정적 초기자가 어떻게 실행되는지를 보도록 하자.


public class MyMimeType {

private static Map<String, String> mimeMap;

  //이 영역이 정적 초기자(static initializer)

static {

System.out.println("$$$$$$$ Hello, This is MyMimeType의 정적 초기자입니다");

mimeMap = new HashMap<String, String>();


mimeMap.put("JSON", "application/json");

mimeMap.put("JPG", "image/jpeg");

mimeMap.put("PDF", "application/pdf");

mimeMap.put("ZIP", "application/zip");

mimeMap.put("JAR", "application/java-archive");

//그 외의 mime 타입은 생략...

}

public static String getMimeType(String mType) {

System.out.println("$$$$$$$ Hello, This is MyMimeType의 getMimeType()입니다");

//위의 정적 초기자에서 입력해 놓은 Map의 key 값으로 Mime Type을 반환해낸다.

//만일에 위에서 지정한 5가지 이외의 mType(Map 객체의 key 역할) 값이 오면 null이 반환된다.

return mimeMap.get(mType.toUpperCase());

}

}


만일에 프로그램의 특정 영역에서 MyMimeType 클래스의 객체 생성 없이 아래와 같이 호출했다고 하면


String mType = MyMimeType.getMimeType("ZIP");


해당 메소드가 실행되기 전에 정적 초기자가 먼저 실행되고 이후에 해당 메소드가 실행이된다. 

다음과 같은 순서로 로그가 출력될 것이다.


$$$$$$$ Hello, This is MyMimeType의 정적초기자입니다

$$$$$$$ Hello, This is MyMimeType의 getMimeType()입니다


이후에 아래와 같이 getMimeType() 메소드를 다시 호출하면 


String mType_2 = MyMimeType.getMimeType("jpg");


이제는 정적 초기자는 실행되지 않고 해당 메소드만 실행이되어 다음과 같은 로그를 출력하게 될 것이다.


$$$$$$$ Hello, This is MyMimeType의 getMimeType()입니다


+ Recent posts