블랙잭 미션을 구현하다가 인스턴스 변수를 선언하면서 동시에 초기화하는 일이 있었다. 뭔가 보기에 불편했는데, 뭐가 잘못됐는지 인스턴스 변수를 어떻게 초기화하는게 좋을지 모르겠어서 공부해보았다.
private final List<Participant> players;
private final List<Participant> players = new ArrayList<>();
인스턴스 변수를 초기화하는 방법은 총 3가지가 있다.
생성자에서 초기화하는 방법
public class Candy {
private final int quantity;
public Candy() {
this.quantity = 0;
}
}
코드 상 인스턴스 변수 선과 초깃값을 표시하는 방법이다. 프로그래머의 관점에서는 그렇지만 방법3와 마찬가지로 초기화 값은 생성자에서 수행된다. 생성자에서 해당 값을 덮어씌울 수도 있다.
public class Candy {
private final int quantity = 0;
}
초기화 블럭에서 인스턴스 변수를 초기화하는 방법도 있다. 튜토리얼에도 써 있듯이(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이 반환된다.
자바에서 초기화하는 순서는 아래와 같다.
- 정적 변수들과 정적 초기화 블럭(순차)
- 인스턴스 변수들과 인스턴스 초기화 블럭(순차)
- 생성자
정답은 없지만 생성자를 통해 초기화해주는 것이 제일 확실하고, 또한 초기화 블럭이나 즉시 초기화의 경우 메서드 파라미터를 받아서 생성할 수 없으므로 생성자를 통해 초기화를 하는 것이 확실하다. 그리고 왠만하면 통일하자.
https://namocom.tistory.com/742
https://www.baeldung.com/java-initialization