본문 바로가기
Language/Java

[Java] final 을 알아보자

by jaee_ 2021. 8. 22.

final이란?

final은 클래스, 메소드 , 변수에 선언할 수 있는 예약어로 불변처리를 할 때 사용한다. final예약어를 사용하면 대상에 대한 변경 또는 확장을 금지할 수 있다.

아래의 예제를 통해서 이해해보자.


클래스에 final을 선언한 예제

public class Animal{} // (1)
public final class Dog extends Animal{} // (2) 
public class poodle extends Dog{} // (3) 에러 상속 불가

(1) Animal이라는 클래스를 (2)의 Dog가 상속받았다.

(2) Dog클래스는 final로 선언하였다.

(3) (2)가 final로 선언하였기 때문에 불변의 상태가 되어 상속이 이루어지지 않는다.


메소드를 final로 선언한 예제

public abstract class Animal {
    public final void eat(String food){
        System.out.println(food+"를 먹는다.");
    }
}


public class Dog extends Animal{
    @Override
    // (1) final 메소드는 재정의(override) 할 수 없다.
    public void eat(String food){ } // 사용불가
}

public class FinalSample {
    public static void main(String[] args){
        Animal animal = new Animal();
        Animal.eat();
    }
}

메소드에 final을 선언하면 override(재정의)할 수 없다. 이는 메소드에 final을 선언함으로써 메소드를 다른 누군가가 변경하지 못하도록 하며, 일관된 메소드를 사용하도록 강제한다.


변수를 final로 선언한 예제

클래스나 메소드에 final을 선언하면 더 이상 상속을 받지 못하게 하고, override를 할 수 없게 한다.

하지만 변수에서의 final선언은 조금 개념이 다르다.

일반적인 변수라면 언제든지 초기화가 가능하다. 하지만 final을 사용하면 "더 이상 못바꿔!"라고 말하는 것과 같다.

그래서 인스턴스 변수클래스 변수선언과 동시에 초기화를 해주어야 한다. 아래의 예제를 보고 이해해보자.

public class FinalVariable{
    final int instanceVariable;    // (1) final변수 선언 --> 에러
    final int instanceVariable = 1;    // (2) final변수 선언과 동시에 초기화 --> 에러안남
}

생성자나 메소드에서 초기화를 하기엔 중복값이 발생할 수 있기 때문에 불변의 상태가 아니다. 그렇기 때문에 반드시 선언과 동시에 초기화를 해주어야 한다.

 

위의 예제는 인스턴스 변수와 클래스 변수에 대해서 다뤘다.

 

그렇다면 매개변수지역변수는 어떨까? 아래의 예제를 보자

public class FinalVariable{
    ifnal int instaceVariable = 1; 

    public void method(final int parameter){
          final int localVariable;
          localVariable = 1; 
          localVariable = 4;    // 에러발생
          parameter = 3;    // 에러발생

    }

}

 

parameter라는 이름의 매개변수를 final로 선언하여 받아왔고, localVariable이라는 지역변수를 final로 선언만 하였다.

  • final이 붙은 매개변수는 이미 값이 정해져서 넘어오기 때문에 값을 다시 할당할 수 없다.
  • 인스턴스, 클래스 변수와는 다르게 지역변수는 선언만 해놓고 해당 메소드 내에서 초기화가 가능하다.
  • 한 번 초기화를 진행하면 값이 할당되기 때문에 다시 값을 할당하면 안된다.

댓글