자바의 final 키워드는 어디 쓰는가에 따라 의미가 다르긴 하지만 결국 final (마지막) 이라 뜻에 충실하다.
변수 - final 은 최종적인 값을 의미한다. 결국 더 이상 변하지 않는 상수를 말한다. (Constant)
클래스 - final 클래스는 최종적인 형태를 말한다. 즉 final 클래스는 상속할 수 없다. Object 로부터 시작하여 더 이상 상속이 불가능한 마지막 자손을 의미한다. 가문의 마지막 후예 정도 될것이다.
메소드 - 마지막 형태의 메소드다. 상속하는 하위 클래스에서 오버라이드(재정의) 할 수 없다. 더 이상 수정할 필요가 없는 메소드니까 최종 진화형태일 것이다.
public class FinalTest {
final static int MAX_COUNT = 5;
public static void main(String[] args) {
for(int i=0; i<MAX_COUNT; i++) {
System.out.println(i + " REPEAT");
}
}
}
final 을 사용해서 멤버 변수를 작성하면 더 이상 변수에 새로운 값을 대입할 수 없다. 멤버 변수 위치에서는 선언과 초기화를 동시에 해줘야한다. final 과 static을 같이 사용하면 클래스안에서 전역변수처럼 사용할 수 있다. static을 사용하면 인스턴스를 생성하지 않아도 사용할 수 있다.
main 메소드에서 final을 사용하면 선언과 동시에 초기화를 하지 않아도 된다. 다만 한번 값을 할당한 이후로는 값을 변경할 수 없다. main 메소드를 벗어나면 다른 메소드에서 사용할 수 없게되니까 클래스 전체의 메소드에서 사용하려면 멤버 변수의 위치에 선언과 초기화를 해서 사용해야 한다.
final class는 더 이상 상속이 불가능하다. 후손 클래스에게 상속이 가능하도록 하려면 final 키워드를 지워야한다.
final 메소드는 상속받은 하위 클래스에서 재정의(Override)가 불가능하다.
final 키워드는 그 의미를 알고 보면 자바의 구조에 대하여 좀 더 이해할 수 있을 것이다.