static block vs instance block vs constructor

Seungyeon Choi·2022년 5월 28일
1

자바

목록 보기
3/5

오픈소스 버전업 작업을 하다가,
클래스의 특정 멤버변수가 초기화되는 방식이 수정되어 기존 TC가 깨지는 문제가 있었다.

문제를 일으킨 수정 커밋은 이 것 이다.

  • 멤버변수에 static 키워드가 추가되었고,
  • 이에 따라 초기화 위치도 static block이 되었다.

수정사항과 별개로 initialization Block 이 생소했어서,

  1. 어떤 역할을 하는지,
  2. 어떤 종류가 있는지,
  3. 생성자와는 무엇이 다른지

알아보았다.

initialization Block 살펴보기

예시 코드

public class Burrito {
	static Long menuId; // 클래스 변수
	int price; // 인스턴스 변수
    
    static {
    	System.out.println("i am static block");
        staticMethod();
    }
    
    {
    	System.out.println("i am instance block");
        instanceMethod();
    }

    public Burrito() {
        System.out.println("i am constructor");
        instanceMethod();
    }
    
    public static void staticMethod() {
    	System.out.println("i am static Method");
    }
    
    public void instanceMethod() {
    	System.out.println("i am instance Method");
    }

    public static void main(String[] args) {
    	System.out.println("부리또 만들기 전입니닷..!");
        new Burrito();
        System.out.println("부리또 만들었습니닷..!");
    }
}

initialization Block 은 말그대로 초기화 블럭이다.

초기화 블럭은 클래스 변수, 인스턴스 변수를 초기화 하는 목적으로 쓰인다.

static block

static 키워드가 붙은 클래스 변수 초기화를 담당한다.

  • 클래스가 로딩될 때 호출된다
    • 따라서 클래스당 최초 1회만 실행된다.
  • 객체가 생성되기 이전에 수행되므로 인스턴스 멤버에 접근할 수 없다.
    • 그렇지만, 스테틱 메소드 호출은 가능하다.

장점: 클래스가 로딩 될 때, 복잡한 초기화 과정을 수행해야 한다면, 유용하게 사용할 수 있다.

instance block

인스턴스 변수 초기화를 담당한다.

  • 인스턴스가 생성될 때마다 수행된다.
  • 인스턴스를 new 키워드를 통해 생성했을때 수행 순서는 다음과 같다.
    1. 인스턴스 멤버 초기화
    2. 인스턴스 초기화 블럭 수행
    3. 생성자 수행
  • 인스턴스 메서드를 초기화 블럭 및 생성자에서 호출할 수 있다.

장점: 모든 생성자가 공통적인 내용을 수행해야할 때 작성하여 중복을 최소화할 수 있다.

생성자와는 무슨 차이가 있을까?

instance block 은 클래스가 인스턴스가 될 때, 생성자가 호출되기 전에 호출된다.

둘 다 인스턴스 변수를 초기화하는 역할을 한다면..
완전히 생성자를 대체할 수 있을까?

아니다.

instance block은 기본값으로 초기화시켜주는 역할까진 가능하지만, 동적으로 인자를 전달받아 인스턴스 변수를 초기화 할 순 없다. setter()를 이용한다거나.. 구현을 달리하는 방법을 제외하고, 순수하게 생성자를 대체할 순 없다.

역할은 같지만, 보완적이라고 이해하는 게 정확하다.
instance block 의 장점에서 서술했듯이, 생성자가 여러개에 중복 코드가 있을 경우, 그 부분을 instance block으로 뺄 수 있다.
따라서, 생성자는 instance block없어도 상관없다.

코드로 확인하기

위에서 봤던 내용을 코드로 확인해보자.

// 출력결과
i am static block
i am static Method // 인스턴스를 생성하지 않아도, 클래스가 로드 될 때 static block이 호출된다
부리또 만들기 전입니닷..!
i am instance block // 인스턴스를 생성하면, instance block -> constructor 순서로 호출된다 
i am instance Method
i am constructor
i am instance Method
부리또 만들었습니닷..!
profile
캘린더 만드는 개발자입니당

0개의 댓글