java에서 final 키워드는 클래스, 메소드, 변수 앞에 붙일 수 있다.
final 키워드가 붙은 클래스를 final class라고 한다. final class는 상속을 할 수 없다. 즉 자식 클래스를 만들 수 없다.
package c.impl;
public final class FinalClass {
}
이렇게 선언되어있는 final 클래스가 있다고 하자. 이 클래스를 어떤 클래스가 상속받으려고 한다.
public class FinalChildClass extends FinalClass {
}
이렇게 하면 final class를 inherit할 수 없다는 컴파일 에러가 발생한다.
final class가 존재하는 이유는 중요한 클래스의 확장을 막기 위해서 이다. String 클래스가 final class인데, 만약 final이 아니라면 String 클래스를 상속받아서 toString() 메소드를 고칠 수도 있다. 이러면 String 클래스의 기본 속성을 변경하는 것이다. 이런 상황을 막기 위해서 final class가 존재한다.
method 앞에 final 키워드가 붙은 경우이다.
final method는 오버라이딩 할 수가 없다. 즉 class안에서 특정 method만 오버라이딩을 막고 싶을 때 final method를 사용한다.
final 변수는 한번 선언할 때 값을 설정하고 그 값을 바꿀 수 없는 변수이다. 이 변수는 선언과 동시에 초기화를 해줘야한다. 그렇지 않으면 컴파일 에러가 난다.
final int instanceVariable;
꼭 아래처럼 작성.
final int instanceVariable = 1;
어차피 모두 값이 같을 것이므로 여러 개 선언되면 메모리 낭비이기 때문에, static 예약어와 함께 쓰여서 'final static'으로 많이 선언한다.
참조 자료형도 final 변수로 사용 가능하다.
final Member m = new Member();
m = new Member(); // compile error
위와 같은 코드는 불가능하지만,
final Member m = new Member();
m.name = "newbie";
위 처럼 필드의 값을 바꾸는 것은 가능하다.
final로 선언된 참조 자료형 안의 필드가 final 변수는 아니기 때문이다.