static 변수를 분명 100으로 초기화해줬는데, 0이 되는 문제가 발생했다!!
class BookManagerImpl{
private static int MAX_SIZE = 100;
private BookManagerImpl() {
System.out.println(MAX_SIZE);
//this.MAX_SIZE = 100;
//System.out.println(MAX_SIZE);
this.books = new Book[MAX_SIZE];
this.size = 0;
}
}
생성자에서 찍어 보니 처음에 0, 100으로 다시 초기화하니 100으로 찍혔다. 대체 왜 이런 일이 발생했을지 궁금해서 static, static final, final, 아무 필드 없이 만들어봤다.
- none : 100으로 초기화됨
- static : 0으로 초기화됨 (default 초기화)
- static final : 100으로 초기화됨
- final : 100으로 초기화됨
가설 : static은 메모리에 할당되어 프로그램이 종료 시 해제된다. 이때 메모리에 할당되기만 하고 default 값으로 초기화가 된다.
final이 붙으면 상수처리 되어 JVM의 Method Area에 있는 Constant Pool에 따로 저장되기 때문에 static final 이나 final 키워드를 붙이면 상수로 저장된다. 하지만 static만 붙일 경우 default 값으로 초기화가 되어 (=100으로 해줬는데 왜그런지 이해할 수는 없지만,, 흠,,) 제대로 초기화해주기 위해서는 생성자에서 초기화 해주거나 final 키워드를 붙여야 하는 것 같다.
뭐.. static만 붙여놓으면 생성자에서 초기화 해줘야 할 것 같다..
++ 알아냄
static 로딩 순서
static 변수는 일단 default 값으로 초기화가 된다.
그리고 순서대로 로더에서 읽으며 실행된다.
public class Test {
static{
//1
}
static int a = 10; //2
static {
Test.a = 100; //3
}
}
위의 코드에서 a는 일단 default 값으로 초기화가 되어 메모리에 생성되어 있다. 그리고 클래스 로더에서 하나씩 읽으며 실행하기 때문에 1번 영역에서 a는 0 (default 값), 2번 영역에서는 10, 3번 영역에서는 100이 된다.
위의 문제의 코드에서는 static 변수의 초기화를 생성자 호출 밑에 했기 때문에 MAX_SIZE의 값은 생성자 호출 시에는 default 값인 0이 되고, 그 후에 100으로 초기화가 된다. 하지만 이미 BookManagerImpl의 books는 0 size로 생성된 상태이다.