# Table of Contents

# final

키워드final은 크게 세 가지 용도로 사용된다.

# 상수

키워드 final은 변수를 값을 변경할 수 없는 상수로 만드는데 사용한다.

final String NAME = "Paul";

이렇게 선언된 상수는 값을 변경할 수 없다.

NAME = "John";  // 아래와 같은 오류가 발생합니다.
// Cannot assign a value to final variable 'NAME'

# 상속 불가능한 클래스

부모 클래스에 final을 붙여보자.

// 부모 클래스 Person
final class Person {

    String name;

    Person(String name) {
        this.name = name;
    }

    void printName() {
        System.out.println(name);
    }
}

이 클래스는 상속할 수 없다.

// 다음과 같은 오류가 발생합니다.
// Cannot inherit from final 'Person'
class Programmer extends Person {   
    
    Programmer(String name) {
        super(name);
    }
}

# 오버라이드 불가능한 메소드

부모 클래스 메소드 앞에 final을 붙으면 오버라이딩이 불가능하다.

// 부모 클래스
class Person {

    String name;

    Person(String name) {
        this.name = name;
    }

    // final 메소드
    final void printName() {
        System.out.println(name);
    }
}
// 자식 클래스
class Programmer extends Person {

    Programmer(String name) {
        super(name);
    }

    // 다음과 같은 오류가 발생합니다.
    // 'printName()' cannot override 'printName()' in 'Person'.
    // overridden method is final.
    void printName() {
        System.out.println(name);
    }
}