본문 바로가기

Programming/Java

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

반응형

자바를 공부하거나 개발하다 보면 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는 명확한 이해가 필수이며, 코드 안정성과 자원 관리에 직접적인 영향을 미친다.

반응형