자바에서 final 키워드는 수정할 수 없는(불변의) 의미를 가지고 있다.
final로 선언된 변수는 한 번 값이 할당되면 변경할 수 없는 상수가 된다. 기본 데이터 타입과 참조 데이터 타입 모두에 사용할 수 있다.
public class Example {
public static void main(String[] args) {
final int MAX_VALUE = 100;
MAX_VALUE = 200; // 컴파일 에러 발생: final 변수는 값을 변경할 수 없음
}
}
public class Example {
public static void main(String[] args) {
final StringBuilder sb = new StringBuilder("Hello");
sb.append(" World"); // 가능: 참조하는 객체의 상태를 변경하는 것은 허용
sb = new StringBuilder(); // 컴파일 에러 발생: 참조 자체를 변경할 수 없음
}
}
⭐ 참조변수는 그 변수의 주소값을 가지고 있는 것이므로, 객체 내부 상태를 변경할 수는 있다. 하지만 당연히 참조하는 객체는 변경할 수 없다.
final로 선언된 메서드는 서브클래스에서 오버라이드할 수 없다. 즉, 해당 메서드를 상속받는 하위 클래스에서는 그 메서드를 재정의할 수 없도록 만든다.
즉, 클래스의 메서드 구현을 안전하게 보호하려는 의도로 사용된다.
class Parent {
public final void display() {
System.out.println("Parent display");
}
}
class Child extends Parent {
// 컴파일 에러 발생: final 메서드는 오버라이드할 수 없음
@Override
public void display() {
System.out.println("Child display");
}
}
final로 선언된 클래스는 상속할 수 없다. 즉, 다른 클래스가 이 클래스를 상속하여 새로운 클래스를 만들 수 없도록 방지하는 것이다.
final class FinalClass {
public void display() {
System.out.println("This is a final class");
}
}
// 컴파일 에러 발생: final 클래스를 상속할 수 없음
class ChildClass extends FinalClass {
}
final클래스는 불변성을 유지하거나 클래스의 동작을 고정하고 싶을 때 사용된다. 예를 들어, 자바의 String 클래스는 final로 선언되어있다. 이는 String객체가 변경될 수 없는 불변 객체임을 보장한다.
💡 String객체의 값이 한 번 설정되면 그 값을 수정할 수 없으며, 새로운 값을 설정하려면 새로운 String 객체를 생성해야한다.