인스턴스 변수는 어떻게 초기화하는게 좋을까?

Hyunta·2022년 3월 15일
0

블랙잭 미션

목록 보기
3/4

학습동기

블랙잭 미션을 구현하다가 인스턴스 변수를 선언하면서 동시에 초기화하는 일이 있었다. 뭔가 보기에 불편했는데, 뭐가 잘못됐는지 인스턴스 변수를 어떻게 초기화하는게 좋을지 모르겠어서 공부해보았다.

private final List<Participant> players;

private final List<Participant> players = new ArrayList<>();

인스턴스 변수 초기화 방법

인스턴스 변수를 초기화하는 방법은 총 3가지가 있다.

1. 생성자에서 초기화

생성자에서 초기화하는 방법

public class Candy {
    private final int quantity;

    public Candy() {
        this.quantity = 0;
    }
}

2. 변수 선언과 함께 초기화

코드 상 인스턴스 변수 선과 초깃값을 표시하는 방법이다. 프로그래머의 관점에서는 그렇지만 방법3와 마찬가지로 초기화 값은 생성자에서 수행된다. 생성자에서 해당 값을 덮어씌울 수도 있다.

public class Candy {
    private final int quantity = 0;
}

3. 초기화 블럭에서 초기화

초기화 블럭에서 인스턴스 변수를 초기화하는 방법도 있다. 튜토리얼에도 써 있듯이(The Java compiler copies initializer blocks into every constructor.) 초기화 코드는 컴파일러에 의해 생성자 코드로 복사된다. 따라서 생성자 호출 전에 수행이 되는 것과는 다르다.

public class Candy {
    private final int quantity;
    {
        quantity = 0;
    }
}

만약 3가지 방법을 동시에 사용하면 어떤 결과가 나올까?

public class Candy {
    private int quantity = 1;
    {
        quantity = 2;
    }

    public Candy() {
        this.quantity = 3;
    }

    public static void main(String[] args) {
        Candy candy = new Candy();
        System.out.println(candy.quantity);
    }
}

<출력 결과>
3

2.변수 선언과 함께 초기화3.초기화 블럭에서 초기화 는 순서에 영향을 받지만 생성자는 항상 후순위에 생성되므로 항상 3이 반환된다.

자바에서 초기화하는 순서는 아래와 같다.

  1. 정적 변수들과 정적 초기화 블럭(순차)
  2. 인스턴스 변수들과 인스턴스 초기화 블럭(순차)
  3. 생성자

결론

정답은 없지만 생성자를 통해 초기화해주는 것이 제일 확실하고, 또한 초기화 블럭이나 즉시 초기화의 경우 메서드 파라미터를 받아서 생성할 수 없으므로 생성자를 통해 초기화를 하는 것이 확실하다. 그리고 왠만하면 통일하자.

Reference

https://namocom.tistory.com/742
https://www.baeldung.com/java-initialization

profile
세상을 아름답게!

0개의 댓글