추상이 상속을 강제하는 것이라면 final은 상속/변경을 금지하는 규제이다.
필드와 변수는 같은 의미이다. 처음 정해진 값이 바뀌지 않도록 금지하는 규제이다.
다음의 코드를 살펴보자.
class field_cal {
static final double PI = 3.14; // 값이 변하지 않도록 규제함
int left, right;
public void setOprands(int left, int right) {
this.left = left;
this.right = right;
field_cal.PI = 6; // PI의 값을 바꾸려고 시도함
}
public void sum() {
System.out.println(this.left + this.right);
}
public void avg() {
System.out.println((this.left + this.right) / 2);
}
}
public class fieldCalculator {
public static void main(String[] args) {
field_cal c1 = new field_cal();
System.out.println(c1.PI);
//Calculator.PI = 10;
}
}
변수 PI는 늘 3.14이다. 즉, 변해서는 안되는 값이므로 final
을 붙여줌으로써 규제하고 있다. field_cal.PI = 6;
를 통해 PI의 값을 바꾸려고 하지만, 컴파일을 진행하면 값이 바뀌지 않는 것을 확인할 수 있다. final로 지정된 변수에는 한번 값이 할당되면 그 값을 바꿀 수 없기 때문 이다. 이러한 특징은 인스턴스 변수에도 적용된다.
final 메소드는 final 변수 만큼 사용 빈도가 높진 않다.
package src.java.finals;
class A {
final void b() {}
}
class B extends A{
void b() { }
}
위의 코드는 final 메소드 b를 상속하려고 하기에 오류가 발생한다.
final은 상속/ 변경을 규제한다.
package src.java.finals;
final class C {
final void b() {}
}
class D extends C {}
위의 코드는 final 클래스를 상속하려 하고 있기에 오류가 발생한다.
Reference
1. final