JAVA/JAVA

Java | Final

pathas 2020. 1. 31. 17:11

Final

final은 '마지막'이라는 뜻으로, 마지막으로 정한 것이니 더 이상 수정할 수 없다는 뜻을 가진 예약어

변수, 메소드, 클래스에 사용 가능


final 사용 위치

위치 설명
변수 멤버 변수 및 지역 변수에 모두 사용 가능하며, final 변수는 상수를 의미
관례적으로 final 변수의 이름은 모두 대문자로 작성
메소드 final 메소드는 하위 클래스에서 재정의 불가, 읽기 전용 메소드가 됨
메소드의 원래 목적과 상관 없는 기능으로 변경하는 것을 방지하기 위함
정적 메소드에 많이 사용됨
클래스 final 클래스는 상속 불가, 클래스 내부의 어떠한 내용도 수정하지 못하도록 해야 하는 경우에 사용

사용례_final 변수

package j200131;

class Parent {

    // final + 멤버 변수 or 지역 변수 => 상수화 되어 값이 고정됨
    final int COUNT = 1;

    public static void main(String[] args) {
        // Parent 클래스 객체 생성
        Parent p = new Parent();

         // 상수 변경 시도 => 에러 발생
//        p.COUNT = 5;
//        The final field Parent.count cannot be assigned, 상수는 값을 새롭게 받을 수 없음

        System.out.println("p.count: " + p.COUNT);    // p.COUNT: 1
    }

}

사용례_final 메소드

package j200131;

class Parent {

    // final + 메소드 => 상속은 허용하지만 메소드 오버라이딩(재정의) 금지
    final void sub() {
        System.out.println("메소드 재정의 제한");
    }
}

public class FinalTest extends Parent {
    // final 메소드 오버라이딩 시도 => 에러 발생
    /*    Cannot override the final method from Parent
    void sub() {
        System.out.println("final 메소드는 오버라이딩 불가");
    }
    */

    public static void main(String[] args) {

    }

}

사용례_final 클래스

package j200131;

// final + 클래스 => 상속 금지 클래스
final class Parent {

}

//    Parent 클래스 상속 시도 => 에러 발생
//    The type FinalTest cannot subclass the final class Parent
//    public class FinalTest extends Parent { 

    public static void main(String[] args) {

    }

}

클래스, 메소드, 변수 앞에 사용하여 더 이상 수정이나 상속을 하지 못하게 만드는 final 예약어에 대해 알아보았습니다.

고정된 값이 필요할 때, 메소드의 내용을 하위 클래스에서 오버라이딩하지 못하게 할 때,

클래스의 상속을 금지할 때 사용하는 것이라고 간단하게 알아두면 되겠습니다.