Java를 학습하다 보면 final, finally, finalize라는 세 가지 키워드를 접하게 됩니다. 이름이 비슷해서 혼동하기 쉽지만, 각각의 역할과 용도는 완전히 다릅니다. 이 글에서는 세 키워드의 차이점을 명확하게 정리해 드립니다.
1. final — 제한을 거는 키워드
final은 키워드(keyword)로, 클래스·메서드·변수에 제약 조건을 부여할 때 사용합니다.
- 클래스, 메서드, 변수에 제한을 적용하는 키워드입니다.
- final로 선언된 클래스는 상속될 수 없습니다.
- final로 선언된 메서드는 하위 클래스에서 오버라이딩(재정의)할 수 없습니다.
- final 변수는 선언 시점에 반드시 초기화해야 합니다.
- 한 번 값이 할당되면 이후에는 변경하거나 다시 초기화할 수 없습니다. 즉, 상수처럼 동작합니다.
사용 예시
예를 들어 final int MAX_VALUE = 100;처럼 선언하면 MAX_VALUE는 프로그램 전체에서 100으로 고정됩니다. 또한 final class는 다른 클래스가 상속하지 못하도록 막아줍니다.
2. finally — 예외와 관계없이 실행되는 블록
finally는 블록(block)으로, try-catch 문과 함께 사용되며 예외 처리 로직에서 중요한 코드를 배치하는 용도입니다.
- try-catch 구문 뒤에 위치하는 코드 블록입니다.
- 예외가 발생했든 발생하지 않았든, 예외가 처리되었든 처리되지 않았든 항상 실행됩니다.
- 주로 파일 닫기, 데이터베이스 연결 해제 등 리소스 정리 작업에 활용됩니다.
3. finalize — 객체 소멸 전 정리 작업을 수행하는 메서드
finalize는 메서드(method)로, 객체가 더 이상 필요 없어져 가비지 컬렉터(Garbage Collector)에 의해 회수되기 직전에 호출됩니다.
- Object 클래스에 정의된 메서드입니다.
- 객체가 메모리에서 제거되기 직전 마무리 정리(clean-up) 작업을 수행하는 데 사용됩니다.
- 실행 시점이 보장되지 않으므로, 최신 Java 개발에서는 try-with-resources나 명시적인 close() 메서드 사용이 권장됩니다.
핵심 차이점 요약
| 구분 | 종류 | 주요 용도 |
|---|---|---|
| final | 키워드 | 클래스·메서드·변수에 변경 및 상속 제한 적용 |
| finally | 블록 | 예외 발생 여부와 무관하게 반드시 실행해야 하는 코드 처리 |
| finalize | 메서드 | 가비지 컬렉션 직전 객체의 리소스 정리 작업 수행 |
세 키워드는 철자가 유사하지만, final은 제한, finally는 예외 처리 후 필수 실행, finalize는 객체 소멸 전 정리라는 서로 다른 목적을 가집니다. 이 차이를 정확히 이해하면 Java 코드를 더 안전하고 견고하게 작성할 수 있습니다.