[Java] 자바 스태틱 블록 (static block), 인스턴스 블록 (instance block), 생성자


1. static block (스태틱 블록)

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

- 한 클래스 안에 여러 개의 static 블록을 넣을 수 있다.

- 용도 :

  주로 클래스 변수를 초기화시키는 코드를 둔다.


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

하하하






2. instance block (인스턴스 블록)

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

- 한 클래스 안에 여러 개의 인스턴스 블록을 넣을 수 있다.

- 용도 : 

  인스턴스 변수를 초기화시키는 코드를 둔다.

  어떤 생성자가 호출되든 그 전에 공통으로 초기화시키고 싶은 작업이 있다면

  인스턴스 블록에서 처리하면 된다.



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}






3. 생성자 (constructor)

- 인스턴스를 생성한 후 자동으로 호출되는 특별한 메서드

- 인스턴스 변수와의 차이점 :

  파라미터를 받아서 인스턴스 변수를 특정 값으로 초기화 시킬 수 있다.

- 여러 개의 생성자를 가질 수 있다. 다만, 그 중에서 한 개만 호출된다.

  호출되는 생성자를  

- (1) 문법 :

  클래스명(파라미터선언) {...}

   => 리턴타입 x

  (2) 문법

  new 클래스명(아규먼트, ...)


 * 주의!

   클래스를 작성할 때 생성자를 만들지 않으면,

   컴파일러가 자동으로 기본 생성자를 만든다.

   => 이 말인 즉슨, 모든 클래스는 생성자를 한 개 이상 갖게 된다는 의미이다.


   new 명령으로 인스턴스를 생성할 때 반드시 어떤 생성자를 호출할 것인지 지정해

   야 한다.



constructor 생성자 예제 1


static class Student {

    static String name = "홍길동"; // 변수 선언에 값을 초기화시키는 문장을 포함할 수 있다.
   
    int age = 20;
    static {
      System.out.println("static {...}");
    }
    { // 인스턴스 블록
      System.out.println("{인스턴스 블록 실행...1}");
    }
   
    // 이렇게 파라미터가 없는 생성자를 기본 생성자(default constructor)라고 한다.
    Student() {
      System.out.println("Student()... 호출");
    }

  }


- 실행 순서 :

  인스턴스 생성 --> 인스턴스 블록 싱행 --> 생성자 호출




생성자 호출 코드


public static void main(String[] args) {

    new Student();
    System.out.println("---------------------------");
    new Student();

  }

- 실행 결과
static {...}
{인스턴스 블록 실행...1}
Student()... 호출
---------------------------
{인스턴스 블록 실행...1}
Student()... 호출
















블로그 이미지

필로그래머

,