TobeSteady

[JAVA] static block 본문

ETC/IT Documentation

[JAVA] static block

NKUT 2023. 1. 31. 21:41

static block (스태틱 블록)

  • 클래스가 로딩되고 클래스 변수가 준비된 후 자동으로 실행되는 블록

    • 한 클래스 안에 여러 개의 static block을 넣을 수 있음.
    • 주로 클래스 변수를 초기화시키는 코드에 사용된다.
  • 예제

    static class Student {
    
        static String name = "홍길동"; // 변수 선언에 값을 초기화시키는 문장을 포함할 수 있다.
        static {
          System.out.println("static...1");
          name = "임꺽정";
        }
        static {
          System.out.println("static...2");
          name = "유관순";
        }
      }
  • 실행 순서 :

    1) 클래스가 로딩된다.
    2) 클래스 변수가 있으면 메모리를 생성한다.
    3) static 블록이 선언된 순서대로 실행된다.


참고 : 클래스 로딩 절차

  1. JRE 라이브러리 폴더에서 클래스를 찾는다.
  2. 없으면, CLASSPATH 환경 변수에 지정된 폴더에서 클래스를 찾는다.
  3. 찾았으면, 그 클래스 파일이 올바른 바이트코드인지 검증한다.
  4. 올바른 바이트코드라면, Method Area 영역으로 파일을 로딩한다.
  5. 클래스 블록이 있으면 순서대로 그 블록을 실행한다.
  6. 클래스 안에 static block (스태틱 블록)들이 있으면 순서대로 그 블록을 실행한다.

  • static block (스태틱 블록)과 변수의 호출 코드

    public static void main(String[] args) {
    
        Student.name = "하하하";
        System.out.println(Student.name);
      }
    # 실행 결과
    static...1
    static...2
    하하하

instance block(인스턴스 블록)

  • 인스턴스가 생성된 후 자동으로 실행하는 블록

    • 한 클래스 안에 여러개의 인스턴스 블록을 넣을 수 있음.
    • 인스턴스 변수를 초기화시키는 코드를 넣어두기 위해 사용된다.
      • 어떤 생성자가 호출되는 그 전에 공통으로 초기화시키고 싶은 작업이 있다면 인스턴스 블록에서 처리하면 된다.
  • 예제

    static class Student {
    
        static String name = "홍길동"; // 변수 선언에 값을 초기화시키는 문장을 포함할 수 있다.
    
        int age = 20;
        static {
          System.out.println("static {...}");
          name = "임꺽정";
        }
        { // 인스턴스 블록
          // 인스턴스 블록은 인스턴스 주소를 보관한 this라는 변수가 내장되어 있다.
    
          System.out.println(age);
          System.out.println("{인스턴스 블록 실행...1}");
          this.age = 30;
        }
        {
          System.out.println("{인스턴스 블록 실행...2}");
        }
      }
  • 실행 순서

    1. 인스턴스를 생성한다.

    2. 생성자가 호출되기 전에 인스턴스 블록이 선언된 순서대로 실행된다.

  • instance block (인스턴스 블록)과 변수의 호출 코드

    public static void main(String[] args) {
    
        new Student();
        System.out.println("---------------------------");
        new Student();
      }
    # 실행결과 : 
    
    static {...}
    20
    {인스턴스 블록 실행...1}
    {인스턴스 블록 실행...2}
    -------------------------
    20
    {인스턴스 블록 실행...1}
    {인스턴스 블록 실행...2}

출처

https://uoonleen.tistory.com/6