final이라는 단어의 뜻은 '마지막의', '최종의' 정도로 해석된다. 단어의 뜻에서 유추할 수 있듯이 final로 선언한 변수 , 메소드, 클래스 등은 최종적인 것이라 생각하면 된다. final로 선언한 변수는 더 이상 바꿀 수 없고 final 클래스는 상속이 불가능하며 final 메소드는 재정의(오버라이딩)이 불가능하다.

각각에 대해 final로 선언된 코드를 보면 바로 이해할 수 있을 것이다.

 

1. final 메소드


package abstractpractice;

public abstract class Car {
   public abstract void drive();
   public abstract void stop();

   public void startCar() {
      System.out.println("turn on");
   }

   public void turnOff() {
      System.out.println("turn off");
   }

   final public void run() {
      startCar();
      drive();
      stop();
      turnOff();
   }
}

Car 클래스는 추상 클래스이며 startCar(), drive(), stop(), turnOff(), run()메소드를 가지고 있다. 어떤 차이든지 시동을 켜는 방법과 끄는 방법은 같을 것이므로 메소드를 구현해 놓았다. 그러나 조작법, 브레이크 작동이 달라 drive()와 stop() 메소드는 추상 메소드로 구현해놓았다.

마지막으로 run() 메소드는 시동on-운전-멈춤-시동off라는 자동차의 로직을 구현해놓은 메소드이다. 모든 차는 저 순서대로 움직이므로 일반 메소드에 미리 로직을 구현해 놓은것이다. 그리고 특정 하위 클래스에서 저 로직을 거스르는 것을 막기 위해 final로 선언을 해놓았다. final 메소드는 하위클래스에서 재정의가 불가능하다.

 

2. final 변수


package abstractpractice;

public abstract class Car {
   final double PI = 3.14;
   final String NAME = "Kim";
   final int MAX = 100;

   public static void main(String[] args) {
      PI = 10.0; //오류
      NAME = "Lee"; //오류
      MAX = 200;//오류
   }
}

변수를 final로 선언하면 상수가 된다. 상수는 변수처럼 그 값이 변할 수 있는 수가 아니다. final로 선언된 상수에 다른 값을 대입하여 저장하려 하면 오류가 난다.

 

 

3. final 클래스


final로 선언된 클래스는 상속될 수 없다. 더 이상 멤버변수나 메소드를 재정의 할 수 없다는 말이다. 우리가 흔히 정수를 선언할 때 쓰는 Int 클래스, 혹은 String 클래스등은 final로 선언되어있다. 쓰는 방법을 바꿀 수 없도록 말이다.

'프로그래밍 언어 > Java' 카테고리의 다른 글

(Java) 36 - 인터페이스와 다형성  (0) 2020.05.17
(Java) 35 - 인터페이스  (0) 2020.05.17
(Java) 33 - 추상 클래스  (0) 2020.05.17
(Java) 32 -다운캐스팅  (0) 2020.05.17
(Java) 31 - 다형성  (0) 2020.05.17

+ Recent posts