본문 바로가기
IT 개인 공부/Java

[Java] final, finally, finalize

by Libi 2021. 6. 29.
반응형

Java에는 final 접두사가 들어가는 final, finally, finalize, 3가지 용어가 존재한다.

 

비슷한 이름 때문에 헷갈릴 수도 있는 이들에 대해서 한번 정리해보도록 하자.

 

final

final은 변경이 불가능하도록 해주는 기능으로 변수, 메서드, 클래스에 적용할 수 있다. 각 영역에 적용하면 다음과 같은 특징을 가지게 된다.

 

 

 

finally

finally는 try-catch 블록에 사용되는 문법으로 무조건 실행되는 블록을 정의해 주는 기능이다.

try-catch 블록은 try 문을 실행하다가 Exception이 발생하게 되면 즉시 catch 문이 실행되기 때문에 남은 try 문은 실행될 수 없다.

BufferedReader br = null;
try {
	br = new BufferedReader(new InputStreamReader(System.in));	
	//br 객체를 사용
    	//만약 Exception이 발생하면 뒤의 내용들을 실행될 수 없음
    	//do Something
	br.close();
} catch (Exception e) {
	//Exception 처리
}
​

하지만 finally 문을 사용하면 finally 구문에 있는 내용은 Exception이 발생 유무에 상관없이 무조건 실행된다.

(단, try-catch 블록이 실행되는 도중에 JVM이 종료되는 경우에는 finally 문이 실행되지 않는다)

BufferedReader br = null;
try {
	br = null;
	br.readLine();
} catch (Exception e) {
	//Exception 처리
    	System.out.println("Exception 발생");
} finally {
	System.out.println("br 객체 자원 반환");	
	br.close();
}

 

 

finalize

finalize는 Object 클래스의 메서드로 메모리를 관리하기 위해 더 이상 참조되지 않는 객체를 GC(Garbage Collector)에 의해 정리될 때 호출되는 종료자 메서드이다.

Object 클래스의 메서드이기 때문에 커스텀 한 클래스에 오버라이딩하여 해당 클래스의 객체가 GC에 의해 정리될 때 특정 동작을 수행하도록 할 수 있다.

간단하게 10개의 Test 객체를 생성하여 참조될 수 없도록 하여 GC를 수행해보자.

class Test {
	
	int idx;
	
	public Test(int idx) {
		this.idx = idx;
	}
	
	@Override
	protected void finalize() throws Throwable {
		System.out.println(getClass() + " "  + idx + " finalize() 메서드 실행");
	}
}

public class Main {
	
	public static void main(String[] args) {
		Test test;
		for (int i = 1; i <= 10; ++i) {
			test = new Test(i);
		}
		test = null;

		System.gc(); //GC 수행
	}
}

결과를 보면 test 변수가 null 값을 가지게 됨으로써 더 이상 참조되지 않는 Test 객체들이 메모리에서 GC에 의해 정리당하면서 finalize() 메서드를 호출하는 것을 확인할 수 있다.

참고로 제거되는 객체의 순서는 무작위이며 메모리의 상황에 따라 일부 객체만 GC에 의해 수행될 수도 있다.

반응형

댓글