Programming/Java

JAVA final, finally, finalize의 차이점 정리

마실개 2025. 4. 15. 11:19
반응형

자바를 공부하거나 개발하다 보면 final, finally, finalize라는 비슷한 이름의 키워드나 메서드를 자주 접하게 된다. 이름은 비슷하지만 쓰임새나 의미는 전혀 다르기 때문에 혼동하기 쉽다. 이 문서에서는 세 가지의 개념을 명확히 구분하고 각각의 역할을 알아보자.


1. final

final은 자바에서 수정 불가능성을 의미하는 키워드다. 다양한 위치에 사용할 수 있으며 의미는 맥락에 따라 조금씩 달라진다.

1.1 변수에 사용

  • 변수에 final을 선언하면 초기화 이후 값 변경이 불가능하다.
  • 주로 상수 선언 시 사용된다.
final int MAX_COUNT = 100;

1.2 메서드에 사용

  • 메서드에 final을 선언하면 서브 클래스에서 오버라이딩할 수 없다.
public final void printHello() {
    System.out.println("Hello");
}

1.3 클래스에 사용

  • 클래스에 final을 붙이면 상속이 불가능하다.
public final class Utility {
    // 상속 불가
}

2. finally

finally예외 처리 구조(try-catch)에서 반드시 실행되어야 하는 코드 블록을 정의할 때 사용된다.

  • 예외가 발생하든 안 하든 finally 블록은 항상 실행된다.
  • 주로 리소스 해제, 정리 작업에 활용된다.
try {
    // 예외 발생 가능성 있는 코드
} catch (Exception e) {
    // 예외 처리
} finally {
    // 반드시 실행되는 블록 (파일 닫기, DB 연결 종료 등)
}

3. finalize

finalize()는 자바의 Object 클래스에 정의된 객체 소멸 직전에 호출되는 메서드다.

  • GC(Garbage Collector)가 객체를 회수하기 전에 호출된다.
  • 명시적으로 호출하지 않으며, 재정의하여 사용한다.
  • 현재는 거의 사용되지 않으며, Java 9부터는 Deprecated 처리되었다.
@Override
protected void finalize() throws Throwable {
    try {
        System.out.println("객체가 소멸됩니다");
    } finally {
        super.finalize();
    }
}

4. 세 키워드 요약 비교

키워드 유형 주요 목적 사용 위치
final 키워드 변경 불가능하게 만들기 변수, 메서드, 클래스
finally 키워드 예외 처리 블록에서 항상 실행 try-catch-finally 구문
finalize 메서드 객체 소멸 전 처리 (Deprecated) 클래스 내부

 


final, finally, finalize는 이름이 비슷하지만 의미와 목적이 완전히 다른 요소들이다. final은 변경 방지, finally는 예외 처리 후 정리 작업, finalize는 소멸 직전 처리로 구분되며, 특히 finalize는 이제 거의 사용되지 않으므로 대체 방법 (예: AutoCloseable)을 고려해야 한다.

실무에서 자주 쓰이는 finalfinally는 명확한 이해가 필수이며, 코드 안정성과 자원 관리에 직접적인 영향을 미친다.

반응형