final은 이름 그대로 마지막, 끝 이라는 의미이다.
변수에 final이 붙는다면 더는 값을 변경할 수 없다는 의미이다.
final은 class, method를 포함한 여러 곳에 붙을 수 있다.
final int a = 10;
a = 20 // 값 변경 불가
final을 지역 변수에 설정할 경우 최초 한번만 할당이 되고 그 후에 값을 변경하면 오류가 발생한다.
class A {
final int a;
public A(int a) {
this.a = a // 딱 한번 초기화
}
}
final을 필드(멤버 변수)에 사용할 경우 해당 필드는 생성자를 통해서 한번만 초기화 될 수 있다.
static 변수에도 final을 선언할 수 있는데, 이것은 상수이다.
변하지 않고, 항상 일정한 값을 갖는 수
class FixNumber {
public static final double PI = 3.14;
public static final int HOUR = 24;
}
자바에서는 보통 단 하나만 존재하는 변하지 않는 고정된 값을 상수라고 한다.
필드는 직접 접근해서 사용한다.
상수는 기능이 아니라 고정된 값 자체를 사용하는 것이 목적이므로
상수는 값을 변경할 수 없기에 필드에 직접 접근해도 데이터가 변하지 않는다.
보통 상수는 애플리케이션 전반에서 사용되기에 public 접근 제어자를 사용한다.
상수는 런타임에 변경할 수 없다.
final은 변수의 값을 변경하지 못하게 한다.
기본형 변수인 경우, 값 자체를 변경하지 못하게 한다.
int a = 10;
a = 20 // 가능
final int b = 20;
b = 30 // 불가능
참조형 변수인 경우, 해당 주소값 자체를 변경하지 못하게 한다.
Data data = new Data(10);
data = new Data(20); // 가능
final Data data = new Data();
data = new Data(10); // 불가능
현재 여기서는 데이터 생성자의 오버로딩이 적용되어 있음
참조형 변수인 경우 한번 객체의 주소값이 선언 시점에 할당되었다면 해당 주소값(참조값)을 변경하지 못한다.
final Data data = new Data();
data.value = 10;
data.value = 20;