final 키워드
static final을 쓰는 이유
public class FieldInit{
static final int CONST_VALUE = 10;
final int value = 10;
}
이 경우 클래스로부터 여러개의 인스턴스를 생성한다고 하면 힙 영역에서 같은 필드값을 가진 여러개의 인스턴스가 생성된다.
각각의 인스턴스가 가진 value의 값은 10이며 바꿀 수 없다. 바뀌지 않는 필드 값을 인스턴스가 생길때마다 생성하는 것은 메모리 측면에서도 낭비이기 때문에 메소드 영역에 static final 변수를 만들어서 클래스로부터 만들어진 모든 인스턴스들이 CONST_VALUE 값을 공유하면 되는 것이다.
정리하자면 변하지 않는 필드값 + 모든 인스턴스가 공유 해야하는 조건이라면 static + final 키워드를 쓰면 것이 효과적이다..
상수(CONSTANT)
상수는 변하지 않고 항상 일정한 값을 갖는 수를 말한다. 자바에서는 보통 단 하나만 존재하는 변하지 않는 고정된 값을 상수라 한다.
이런 이유로 상수는 static final 키워드를 사용한다.
자바 상수 특징
final 참조변수라면?
public class Data{
public int value;
}
public class FinalTest{
public static void main(String[] args){
final Data data = new Data(); // data = x001 ;
Data data2 = new Data(); // data2 = x002 ;
// 다른 참조값 할당은 불가
// data = data2;
data.value = 10; // x001.value
data.value = 20; // x001.value
}
}
참조형 변수에 final이 붙으면 참조 대상 자체를 다른 대상으로 변경하지 못한다는 것이다. 따라서 참조 대상의 값은 변경할 수 있다.
data에는 final 키워드가 붙었기에 data2가 가리키는 참조값을 할당할 수 없다는 뜻이다.
그러나 data이 가리키는 참조값의 인스턴스에 접근하여 value값은 변경할 수 있다는 것이다.
정리
항상 제약이 중요하다. 제약을 통해서 의도를 알 수 있기 때문이다.