본문 바로가기
Old Posts/Java

[Java] final 키워드의 의미와 예제

by A6K 2021. 6. 27.

자바 코드에서 자주 볼 수 있는 final 키워드에 대해서 정리해보자. final은 '최종적'이라는 의미를 갖고 있는 단어다. 자바에서는 final 키워드를 멤버 변수와 클래스, 메소드 그리고 메소드 인자에 붙일 수 있다. 각각이 의미하는 바에 대해서 알아보자.

1. final 멤버변수

클래스를 선언할 때 멤버 변수의 앞에 final 키워드를 붙일 수 있다.

private final int number = 0;

이 경우 변수에 값 할당을 딱 한번 할 수 있다. final 멤버 변수에 값을 할당하는 방법에는 필드 선언시하는 것과 생성자를 통해서 할당하는 것이 있다. 만약 멤버 변수를 final로 선언하고, 선언부와 생성자에서 초기화하지 않으면 컴파일 에러가 발생한다. 이렇게 값이 할당된 멤버변수의 값은 다시 다른 값으로 변경할 수 없다. 객체가 생성되고 난 이후에는 상수처럼 작용해야하는 특성의 멤버 변수 앞에 final 값을 붙여주게 된다.

2. final 변수

final 변수는 final 멤버변수와 마찬가지로 최초 한번만 할당할 수 있고 이후 다시 할당할 수 없다. 변수가 객체에 대한 참조인 경우에도 최초 참조하는 객체 이외의 다른 객체를 참조할 수 없다.

final Person person = new Person("Eric");
person = new Person("Tom") // Compile Error

변수가 다른 객체를 참조하도록 바꿀 수는 없지만 참조된 객체의 메소드를 통한 객체 자체의 값은 바꿀 수 있다. 즉, final 변수로 만들었다고 객체 자체가 불변(Immutable)이 되는 것은 아니다.

3. final 클래스

final class Person {
  String name;
}

// 상속 불가능
class Doctor extends Person {

}

final 키워드가 붙은 클래스는 다른 클래스가 상속할 수 없다. 특정 클래스를 상속하면서 메소드들을 오버라이드해서 사용하는 꼼수를 막고 싶은 경우 final 키워드를 클래스 앞에 붙여주면 된다.

4. final 메소드

public class Person {

  String name = "";
  
  public void setName(String name) {
    this.name = name;
  }
}

public class Doctor extends Person {

  // 오버라이드 불가능
  public void setName(String name) {
    this.name = "Doctor " + name;
  }
}

클래스 정의시 final 키워드를 메소드 앞에 붙이면, 해당 메소드를 오버라이드 할 수 없다. 클래스를 정의하면서 상속은 허용하되 코어 로직은 오버라이드 할 수 없도록 만들고 싶다면 메소드에 final 키워드를 붙이면 된다.

final 키워드를 멤버변수, 클래스, 메소드 등에 붙이면서 좀 더 안전한 코드를 만들 수 있다.

댓글