final은 자바 요소에 적용되는 비접근 제어자(non-access modifier)입니다. final 한정자는 클래스, 메서드, 변수의 구현을 '최종 확정'하여 더 이상의 변경을 막는 역할을 합니다.
1. Final 변수
final로 선언된 변수는 명시적으로 단 한 번만 초기화할 수 있습니다. 참조형 변수(reference variable)를 final로 선언하면, 해당 변수가 다른 객체를 다시 참조하도록 재할당하는 것은 불가능합니다.
다만 주의할 점이 있습니다. 객체 내부의 데이터는 변경이 가능합니다. 즉, 객체의 상태(state)는 바꿀 수 있지만 참조 자체는 바꿀 수 없습니다.
변수에 final을 사용할 때는 static과 함께 조합하여 상수(constant)를 클래스 변수(class variable)로 만드는 경우가 많습니다.
예제 코드
public class Test {
final int value = 10;
// 상수 선언의 대표적인 예시:
public static final int BOXWIDTH = 6;
static final String TITLE = "Manager";
public void changeValue() {
value = 12; // 컴파일 에러 발생
}
}
2. Final 메서드
final로 선언된 메서드는 어떤 하위 클래스(subclass)에서도 오버라이딩(overriding)할 수 없습니다. 앞서 언급했듯이, final 한정자는 서브클래스에서 메서드를 수정하는 것을 방지합니다.
메서드를 final로 만드는 주된 의도는 메서드의 내용(구현 로직)을 외부에서 임의로 변경하지 못하도록 보호하기 위함입니다.
예제 코드
클래스 선언부에서 메서드를 final 한정자와 함께 선언하는 방법은 다음과 같습니다.
public class Test {
public final void changeName() {
// 메서드 본문
}
}
3. Final 클래스
클래스를 final로 선언하는 가장 큰 목적은 해당 클래스가 상속되는 것을 방지하는 것입니다. 클래스에 final이 붙어 있으면 어떤 클래스도 이 final 클래스를 상속받아 기능을 물려받을 수 없습니다.
대표적인 예로 자바 표준 라이브러리의 String, Integer 등이 final 클래스로 설계되어 있으며, 이를 통해 불변성(immutability)과 안전성을 보장합니다.
예제 코드
public final class Test {
// 클래스 본문
}
정리
- final 변수: 한 번만 초기화 가능, 값(또는 참조) 변경 불가 — 상수 선언에 활용
- final 메서드: 하위 클래스에서 오버라이딩 불가 — 핵심 로직 보호
- final 클래스: 상속 불가 — 클래스 설계의 무결성 유지