본문 바로가기
JAVA

java Class initializationblock(instance initialization) , 초기화 생성 블럭

by 아이티.파머 2021. 6. 9.
반응형

초기화 블럭 종류

  • 클레스 초기화 블럭
  • 인스턴스 초기화 블럭

클레스 초기화

  • 클레스가 처음 로딩될때 한번만 수행되는 블럭
  • 인스턴스 변수 및 메서드에 접근 불가 (static 으로 선언된 곳은 접근 가능)

인스턴스 초기화

  • 인스턴스가 생성될때마다 수행되는 블럭
  • super 생성자 이후에 실행됨
  • 생성자 보다 먼저 생성됨

모든 생성자의 콩통 코드를 인스턴스 초기화 블럭에 넣으면 코드가독성이 좋다.

for example)

package primitive;

/**
 *  클레스 초기화 테스트
 *    - 클레스 초기화
 *    - 인스턴스 초기화
 */
public class InitializationClass {

    static {
        System.out.println("1.클레스 초기화");
    }

    {
        System.out.println("2.인스턴스 초기화 블럭");
    }

    public InitializationClass() {
        System.out.println("3. 인스턴스 초기화");
    }

}

class InitializationClassTest {

    public static void main(String[] args) {
        InitializationClass initializationClass = new InitializationClass();
        InitializationClass initializationClass1 = new InitializationClass();
        InitializationClass initializationClass2 = new InitializationClass();
    }

}

결과

클레스 초기화 부분은 한번만 수행되고, 인스턴스들은 생성될때마다 초기화 불럭이 실행된다.

"C:\Program Files\Java\jdk-15.0.1\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2020.2.3\lib\idea_rt.jar=58088:C:\Program Files\JetBrains\IntelliJ IDEA 2020.2.3\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\Mezzomedia\git\skan.study\target\classes;C:\Users\Mezzomedia\.m2\repository\org\tmatesoft\svnkit\svnkit\1.8.7\svnkit-1.8.7.jar;C:\Users\Mezzomedia\.m2\repository\com\jcraft\jsch.agentproxy.svnkit-trilead-ssh2\0.0.7\jsch.agentproxy.svnkit-trilead-ssh2-0.0.7.jar;C:\Users\Mezzomedia\.m2\repository\com\jcraft\jsch.agentproxy.core\0.0.7\jsch.agentproxy.core-0.0.7.jar;C:\Users\Mezzomedia\.m2\repository\net\java\dev\jna\jna-platform\4.1.0\jna-platform-4.1.0.jar;C:\Users\Mezzomedia\.m2\repository\net\java\dev\jna\jna\4.1.0\jna-4.1.0.jar;C:\Users\Mezzomedia\.m2\repository\com\trilead\trilead-ssh2\1.0.0-build217\trilead-ssh2-1.0.0-build217.jar;C:\Users\Mezzomedia\.m2\repository\com\jcraft\jsch.agentproxy.connector-factory\0.0.7\jsch.agentproxy.connector-factory-0.0.7.jar;C:\Users\Mezzomedia\.m2\repository\com\jcraft\jsch.agentproxy.usocket-jna\0.0.7\jsch.agentproxy.usocket-jna-0.0.7.jar;C:\Users\Mezzomedia\.m2\repository\net\java\dev\jna\platform\3.4.0\platform-3.4.0.jar;C:\Users\Mezzomedia\.m2\repository\com\jcraft\jsch.agentproxy.usocket-nc\0.0.7\jsch.agentproxy.usocket-nc-0.0.7.jar;C:\Users\Mezzomedia\.m2\repository\com\jcraft\jsch.agentproxy.sshagent\0.0.7\jsch.agentproxy.sshagent-0.0.7.jar;C:\Users\Mezzomedia\.m2\repository\com\jcraft\jsch.agentproxy.pageant\0.0.7\jsch.agentproxy.pageant-0.0.7.jar;C:\Users\Mezzomedia\.m2\repository\de\regnis\q\sequence\sequence-library\1.0.3\sequence-library-1.0.3.jar;C:\Users\Mezzomedia\.m2\repository\org\tmatesoft\sqljet\sqljet\1.1.10\sqljet-1.1.10.jar;C:\Users\Mezzomedia\.m2\repository\org\antlr\antlr-runtime\3.4\antlr-runtime-3.4.jar;C:\Users\Mezzomedia\.m2\repository\org\quartz-scheduler\quartz\2.3.2\quartz-2.3.2.jar;C:\Users\Mezzomedia\.m2\repository\com\mchange\c3p0\0.9.5.4\c3p0-0.9.5.4.jar;C:\Users\Mezzomedia\.m2\repository\com\mchange\mchange-commons-java\0.2.15\mchange-commons-java-0.2.15.jar;C:\Users\Mezzomedia\.m2\repository\com\zaxxer\HikariCP-java7\2.4.13\HikariCP-java7-2.4.13.jar;C:\Users\Mezzomedia\.m2\repository\org\slf4j\slf4j-api\1.7.7\slf4j-api-1.7.7.jar primitive.InitializationClassTest
1.클레스 초기화
2.인스턴스 초기화 블럭
3. 인스턴스 초기화
2.인스턴스 초기화 블럭
3. 인스턴스 초기화
2.인스턴스 초기화 블럭
3. 인스턴스 초기화

언제 사용할까 ?

개발하면서 , 단한번만 초기화 되어야 하는 경우와. 중복된 코드 수행등 모든 생성자에 공통으로 수행해야 하는 문장이 있어야할때 초기화 블럭을 이용하면 중복코드를 줄이고 가독성을 높일 수 있다.
이전에 서버의 성능이 좋치 않았을때는 메모리 효율관리 관점으로도 바라보지 않았을까 생각한다.

the below example

package primitive;

public class InitializationClass {
    String DATA;
    static String class_data;
    static {
        class_data = "1.클레스 초기화 - 1";
        String class_data_2 = "1.클레스 초기화-2";
        System.out.println(class_data);
        System.out.println(class_data_2);
    }
    {

        DATA = "2.인스턴스 데이터 최기화";
        System.out.println(DATA);
        this.methodTest();
    }

    public InitializationClass() {
        System.out.println("3. 인스턴스 초기화");
    }

    public void methodTest() {
        System.out.println("call methodTest");
    }

}

class InitializationClassTest {

    public static void main(String[] args) {

        InitializationClass initializationClass = new InitializationClass();
        InitializationClass initializationClass1 = new InitializationClass();
        InitializationClass initializationClass2 = new InitializationClass();

        System.out.println("-----------------------------------------------------");
        System.out.println(InitializationClass.class_data);      // 멤버필드 값 참조 가능.
        //System.out.println(InitializationClass.class_data_2);  // 접근불가

    }

}

결과

1.클레스 초기화 - 1
1.클레스 초기화-2
2.인스턴스 데이터 최기화
call methodTest
3. 인스턴스 초기화
2.인스턴스 데이터 최기화
call methodTest
3. 인스턴스 초기화
2.인스턴스 데이터 최기화
call methodTest
3. 인스턴스 초기화
-----------------------------------------------------
맴버 필드값 참조 가능 = 1.클레스 초기화(상수값) - 1
반응형