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
로 상수를 정의하여 공유 및 변경 불가한 값으로 사용.