앞서 final 키워드에 대한 포스팅을 올렸는데, static과 같이 사용하면 내용이 길어져서 따로 정리하려고 한다.
우선 static의 경우 객체 생성 없이 사용할 수 있는 필드, 메서드를 생성하고자 할 때 사용된다.
static으로 선언될 경우 GC가 관여하지 않는 static 메모리 영역에 적재되어 모든 객체가 공유한다.
물론 너무 남발하면 메모리 할당된 채로 남아있어 좋지는 않다.
특징을 간단하게 요약하자면 아래와 같다.
- 프로그램이 시작할 때 단 한 번만 생성되고 초기화된다.
- 인스턴스를 생성하지 않고 바로 사용 가능
- 해당 클래스의 모든 인스턴스 공유
static과 final
일단 제일 큰 특징은 static과 final를 이용하여 상수 정의에 사용한다.
public static final double PI = 3.141592653589793
이렇게 사용하게 되면 객체마다 저장될 필요(static)가 없고, 여러 값을 가질 수 없게 된다(final).
즉, 효율성이 높아지게 된다.
final과 인스턴스 변수
이제 포커스를 final에 두고 설명하고자 한다.
final로 변수를 선언할 경우 선언과 초기화를 동시에 해야한다.
하지만, final로 선언한 인스턴스 변수의 경우 생성자에서 초기화가 가능하게 된다.
생성자로부터 받은 매개변수로 인스턴스 변수를 초기화할 수 있어야 하기 때문
추가로 static 키워드의 유무에 따라 초기화 시점이 달라진다.
아래 예제 참고
instance final
// Instance Final
private final int a = 1
// 1. 선언할 때 초기화
// 초기화 값은 생성자에서 수행하며, 생성자에서 값을 덮어 씌울 수 있음
private final int b;
{
b = 2;
}
// 2. 초기화 Block 이용
public class Person {
private final int age;
public Person() {
this.age = 20;
}
}
// 3. 생성자에서 초기화
추가로 생성자에서 초기화를 할 경우 항상 나중에 생성되므로
동시에 같은 방법을 사용하게 된다면 항상 생성자에서 초기화된 결과만 반환된다.
static final
// Static Final
private static final int a = 1
// 선언할 때 초기화
private static final int b;
static {
b = 2;
}
//Static Block을 이용하여 초기화