final 변수
- final 키워드는 변수를 선언할 때 지정하며, 한 번 초기화된 값은 최종값으로 재할당할 수 없다. (변경 불가)
- 변경의 범위는 그 변수의 값에 한정된다.
- 클래스 내의 필드는 초기화를 하지 않으면 자동으로 강제 초기화가 되지만 final 변수는 강제 초기화되지 않는다. (지역 변수, 필드 관계없음)
- final로 선언된 변수는 초기화될 때 상수 영역에 필드와 값이 복사된다.
final 자료형 변수명;
// 예시
public class Main {
public static void main(String[] args) {
final MyClass1 mc = new MyClass1(10, 10); // num1 = 10, num2 = 10
mc.num1 += 10; // '변경의 범위는 그 변수의 값에 한정된다'의 의미 -> num1 = 20
}
}
class MyClass {
int num1; // 필드는 초기화하지 않아도 강제 초기화됨
final int num2; // 강제 초기화가 되지 않기 때문에 초기화해야함
MyClass(int num1, int num2) {
this.num1 = num1;
this.num2 = num2; // 초기화된 순간부터 재할당(변경) 불가능
}
}
final 메서드
- final 키워드가 붙은 메서드는 최종 메서드라는 의미를 지닌다.
- final 메서드로 선언하게 되면 상속을 받은 하위클래스에서 오버라이딩을 할 수 없게 된다.(변경 불가)
final 리턴 타입 메서드명(매개변수) {
}
// 예시
class MyClass1 {
final void myMethod() {
System.out.println("MyClass1 : myMethod");
}
}
class MyClass2 extends MyClass1 {
@Override
void myMethod(){ // 오버라이딩 불가, 예외 발생
System.out.println("MyClass2 : myMethod");
}
}
final 클래스
- 위와 같은 개념으로 최종 클래스라는 의미를 지니며, final 클래스는 상속 자체가 불가능하다.
final 클래스명 {
}
// 예시
final class MyClass1 {
...
}
class MyClass2 extends MyClass1 { // 상속 불가, 예외 발생
}