Java를 사용하다보면 종종 final
이란 키워드를 만나볼 수 있다.
아래는 오늘 소개해볼 final
을 적용해볼 수 있는 구간들이다.
// 클래스
public final class Person {
// (전역) 변수
private final Name name;
public Person(final Name name) {
this.name = name;
}
// 메서드
final void setName(final Name newName) {
name = newName;
}
}
Java의 final 키워드는 비접근 제어자로 변수, 메서드, 클래스에 사용되며 이들의 수정을 제한시킨다.
원시 타입 변수부터 보자.
final
이 있고 없는 두 변수의 값을 수정하려는 시도를 하였다.
final을 명시한 변수의 경우 IntelliJ가 컴파일 에러의 발생을 감지하여 빨갛게 밑줄을 나타내었다.
그럼 참조 타입 변수의 경우는 어떨까? String
을 인스턴스 변수로 가지는 Name 클래스 예시를 통해 알아보자.
참조 타입 변수의 경우 setter를 통한 인스턴스 변수 수정은 정상 동작하였으나 생성자를 통해 새로운 객체를 할당하는 경우 컴파일 에러가 발생하였다.
우리는 여기서 final 이 하는 일을 재정리할 수 있다.
final을 Variable에 사용하는 경우 '재할당'을 불가능하게 한다.
다른 예시로 상수와 인자가 있다.
상수의 경우 보통 private static final
또는 public static final
형태로 변수를 선언한다. static
을 통해 컴파일 시점에 메모리 할당을 한번만 하기 때문에 효율성 측면에서 이점을 가진다.
인자의 경우 메서드 내부에서 인자를 변경할 수 없도록 해줄 수 있다.
void doSomeWork(final String name) {
name = "daon"; // compile Error!
}
위의 동작을 이해하였다면 메서드와 클래스는 이해하기 쉽다.
메서드의 경우 자식 클래스에서 final 키워드가 사용된 부모 클래스의 메서드를 재정의 할 수 없다. 이를 시도하면 컴파일 에러가 발생한다.
class Parent {
final void makeDance() {
}
]
class Child extends Parent {
// Compile Error!
@Override
void makeDance() {
}
}
클래스에 final을 사용한다면 해당 클래스는 상속할 수 없는 클래스가 된다. 즉 부모 클래스가 될 수 없다. 상속을 시도한다면 컴파일 에러가 발생한다.
final class FinalClass {
// ...
}
// Compile Error!
class ChildClass extends FinalClass {
}
대표적으로 String
클래스가 존재한다.
final로 재할당을 명시적으로 방지할 수 있지만 불변과는 엄연히 다른 개념이다.
위에 예시로 들었던 Name 참조 타입 변수를 다시 보자.
public class Name {
private String name;
Name(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String newName) {
name = newName;
}
}
위의 결과와 같이 name의 인스턴스 변수는 수정이 되었다.
final은 다른 참조나 다른 객체를 가리키도록 객체의 참조를 변경할 수는 없지만 상태를 변경할 수는 있다.
이와 달리 불변 객체는 실제 값을 변경할 수 없지만 참조를 다른 값으로 변경할 수 있다.
final 키워드를 사용하여 코드를 통해 작성자의 설계 의도를 나타낼 수 있다.
그러나 가독성 측면과 확장성을 제한한다는 트레이드 오프가 있기에 자기만의 기준을 가지고 적용하는 것이 중요하다.
https://www.w3schools.com/java/ref_keyword_final.asp
final Keyword in Java
final vs Immutability in Java
깔끔 정리 굿 👍 저는 불변인 지역 변수에 습관적으로 final을 붙이다가 오히려 가독성을 해칠 수 있다는 피드백을 받았는데 다온의 final 붙이는 기준이 어떻게 되는지 궁금하네요..!!