본문 바로가기
프로그래밍언어/Java

[Java] : 오버라이딩을 제한하는 final

by 오주현 2022. 1. 17.
반응형

오버라이딩을 제한하는 final

부모 클래스의 메서드 오버라이딩을 막기 위해 메서드 앞에 final 키워드를 붙여 사용한다.

final이 붙은 메서드는 자식 클래스에서 오버라이딩을 할 수 없고 부모 클래스에서 정의한 대로 사용해야 한다. 주로 static과 함께 클래스 변수를 상수처럼 지정하는 데 사용된다.

즉, final이 붙은 필드와 메서드는 말 그대로 마지막이 되므로 상속이 불가능하고 마지막 변수 값을 갖기 때문에 값의 수정이 불가능하게 된다.

예시 코드

class TestCarSetting {
    int testCarSettingSpeed = 0;

    final void upSpeed(int testCarSettingSpeed) {
        this.testCarSettingSpeed += testCarSettingSpeed;
    }
}

TestCarSetting 클래스는 부모 클래스이다.

부모 클래스에서 Speed를 0으로 설정해 주고

final을 통해 upSpeed 메서드를 만들어 준다.

class Sedan extends TestCarSetting {
    final static String TestCarType = "승용차";

    void upSpeed(int testCarSettingSpeed){
        this.testCarSettingSpeed -= testCarSettingSpeed;
    }
}

Sedan은 TestCarSetting 클래스를 상속 받은 자식 클래스이다.

Sedan 클래스에서 final을 통해 변경을 하지 못 하도록 막아준다.

그리고 아래에서 upSpeed() 메서드를 재정의를 시도해 본다.

public class TestCar {
    public static void main(String[] args) {

        System.out.println("Sedan 클래스 타입 => " + Sedan.TestCarType);
    }
}

바로 Sedan의 TestCarType를 출력해 보면

오류를 보면 재정의 할 수 없다고 나온다.

class sedan extends TestCarSetting {
    final static String TestCarType = "승용차";

/*    void upSpeed(int testCarSettingSpeed){
        this.testCarSettingSpeed -= testCarSettingSpeed;
    }*/
}

이번에는 재정의한 부분을 주석처리하고 다시 돌려본다.

정상적으로 출력이 되는 것을 볼 수 있다.

이렇게 final로 지정된 메서드나 변수는 따로 변경이 불가능하고 말 그대로 마지막으로 정의 된 무언가이기 때문에 있는 그대로 사용해야 한다.

반응형

댓글