final 키워드final 키워드는 자바에서 변경 불가능성을 의미한다. 변수, 메서드, 클래스에 사용되어 그 요소가 변경될 수 없도록 제한한다. final은 코드의 안정성, 가독성, 성능 최적화에 기여할 수 있다.
final 변수final로 선언된 지역 변수는 한 번만 값을 할당할 수 있다. 한 번 값이 할당되면 값을 변경할 수 없게 된다.final을 사용하면, 객체 생성 시 초기화가 이루어져야 하며 그 이후에는 값을 변경할 수 없다. 하지만 참조형 변수의 경우, 객체 내부 상태는 변경 가능하나 참조 자체는 변경할 수 없다.final로 선언하면, 메서드 내부에서 그 파라미터의 값을 변경할 수 없다. 이는 메서드 내에서 참조의 무결성을 유지할 때 유용하다.final List<String> list = new ArrayList<>();
list.add("Hello"); // 내부 상태 변경은 가능
// list = new ArrayList<>(); // 참조 변경 불가 (컴파일 에러)
final 메서드final로 선언된 메서드는 하위 클래스에서 오버라이딩할 수 없다. 이는 상위 클래스의 메서드 동작을 하위 클래스가 변경하지 못하도록 고정하는 역할을 한다. 주로, 메서드의 동작을 반드시 유지해야 할 때 사용된다.
class Parent {
final void display() {
System.out.println("Parent display");
}
}
class Child extends Parent {
// void display() { // 컴파일 에러 (오버라이딩 불가)
// System.out.println("Child display");
// }
}
final 클래스final로 선언된 클래스는 상속될 수 없다. 즉, 다른 클래스가 해당 클래스를 확장할 수 없으며, 상속을 통해 동작을 변경하지 못하도록 만든다. 주로 보안이나 설계상 변경이 필요 없는 클래스에 사용된다.
final class Parent {
void display() {
System.out.println("Parent display");
}
}
// class Child extends Parent { // 컴파일 에러 (상속 불가)
// }
String, Integer와 같은 불변 객체 클래스들이 대표적인 final 클래스이다.static final: 상수 선언static final은 상수를 정의할 때 사용된다. static은 클래스 단위로 공유된다는 의미이며, final은 변경할 수 없는 값을 의미힌다. 보통 상수는 대문자로 표기하며, 주로 공용으로 사용되는 상수를 선언할 때 사용한다.
class Constants {
static final String COMPANY_NAME = "OpenAI"; // 상수 선언
}
public class Main {
public static void main(String[] args) {
System.out.println(Constants.COMPANY_NAME); // "OpenAI" 출력
}
}
final의 장점final로 선언된 변수는 멀티스레드 환경에서도 안전하게 사용할 수 있다.final로 선언된 변수를 최적화할 수 있어 성능이 향상될 수 있다.final을 사용하면 해당 요소가 변경되지 않음을 명확히 전달하여 가독성이 높아진다.final의 차이점final 변수: 변수의 참조 재할당을 막는다. 하지만 참조하는 객체의 내부 상태는 변경 가능하다.String, Integer 같은 불변 클래스들은 객체의 내부 상태를 변경할 수 없다.final List<String> list = new ArrayList<>();
list.add("Hello"); // 내부 상태 변경 가능
final String str = "Hello";
// str = "World"; // 재할당 불가 (컴파일 에러)
final 변수는 변수의 재할당만 막을 뿐 내부 상태 변화는 허용한다.📌
- 변수:
final로 선언된 변수는 재할당 불가. 참조형 변수는 참조 대상 변경 불가, 그러나 내부 상태 변경 가능.
- 메서드:
final메서드는 오버라이딩 불가, 기본 동작 유지.
- 클래스:
final클래스는 상속 불가, 클래스 확장 불가.
- 상수:
static final로 상수를 정의하여 공유 및 변경 불가한 값으로 사용.