절대로 변하지 않는 특정한 것을 사용할 때 final을 사용한다. 변수 메소드 클래스에 모두 사용할 수 있다.
변수의 경우, 변하지 않는 상수
메소드의 경우,  상속한 자식클래스에서 오버라이딩(재정의)가 불가능한 메소드
클래스의 경우, 상속이 불가능한 완전한 클래스가 된다.

[정리] final을 사용해서, 더이상 바뀌지 않게 보호하는 기능을 한다고 할 수 있다.

cf) 인터페이스의 필드는 모두 final이 생략되어있다.

[1] final 상수를 만들어보자.

1. final 변수(상수)를 만들어보자. 이 때, 어떠한 수를 다시 대입하면 오류가 난다.

        final int number = 10;
         System.out.println(number);
        
         number=5; //오류가 난다.

[2] final 메소드를 만들어보자.(1 ~3 까지는 final이 아니라서, 재정의된 오버라이딩 메소드를 호출한다.)

1. Parent클래스를 만들고, 출력문을 가진 메소드 show()를 만들자.

public class Parent {

    public void show() {
        
         System.out.println("Hi from Parent");
        
     }   
    
}

2. 메인클래스에서 Parent 클래스를 상속받고, (STATIC 메인메소드에서도, 재정의한 메소드를 호출할 수 있게)메인클래스 객체를 생성해서,
   부모parent에 있는 show()메소드를 이용해보자.

public class Main extends Parent{
     public static void main(String[] args) {
         Main main = new Main();
         main.show();       
     }
}

3. 이제 부모클래스의 show()를 오버라이딩 해서, 재정의한 show();가 호출되도록 해보자.

public class Main extends Parent{

    @Override
     public void show() {
         System.out.println("hello from Main");
     }

    public static void main(String[] args) {

        Main main = new Main();
         main.show();
        
     }
}

4. 이제 Parent 클래스의 show()메소드에 final을 붙혀보자. -> 자식인 Main클래스에서 오버라이딩 한 곳에서 오류가 난다.
   ***final이 붙은 메소드는, 부모클래스의 것이더라도 자식이 오버라이딩해서 사용 못한다!

    public final void show() {       
         System.out.println("Hi from Parent");       
     }
    


[3] 클래스에 final을 붙혀보자.

1. Parent클래스에 public을 빼고, final class로 바꿔보자.  => 상속한 자식인 Main클래스에서 오류가 난다.
  *** final이 붙은 클래스는, 다른 클래스에서 더이상 상속하지 못한다.

MY) 완전한 설계도이므로, 객체를 생성해서 사용할 수 밖에 없다. 상속할 자식은 더이상 존재할 수 없음.

[정리] final을 사용해서, 더이상 바뀌지 않게 보호하는 기능을 한다고 할 수 있다.

+ Recent posts