<aside> 💡

자바에서 객체소멸은 가비지컬렉터가 담당하고, 비메모리자원회수는 try-with-resources, try-finally로 해결

</aside>

왜 쓰지 말라는거야?

  1. 즉시 수행된다는 보장이 없어!

  2. 자원 회수가 제멋대로 지연…

  3. 수행 여부조차 보장되지 않음!

  4. 동작 중 발생한 예외가 무시

  5. GC 의 효율을 떨어뜨림

  6. 보안 문제를 일으킬 수 있음

    <aside> 💡

    객체가 정상적으로 생성되지 않거나 역직렬화 과정에서 예외가 발생한 후에도 finalize() 메서드가 호출되는 상황과 관련된 문제

    </aside>

대안책 : AutoCloseable

<aside> 💡

파일이나 스레드 등 종료해야 할 자원을 담고 있는 객체의 클래스에서 AutoCloseable을 구현해주고, 클라이언트에서 인스턴스를 다 쓰고 나면 close 메서드를 호출

</aside>

try-finally : 명시적으로 자원 반납

public class SampleResource implements AutoCloseable {
	@Override
	public void close() throws RuntimeException {
		System.out.println("close");
	}

	public void hello() {
		System.out.println("hello");
	}
}
public class SampleRunner {
	public static void main(String[] args) {
		try {
			SampleResource resource = new SampleResource();
			resource.hello(); // 리소스 사용
		} finally {
			resource.close(); // 리소스를 사용하는 쪽에서 쓴 다음 반드시 정리. close() 호출
		}
	}
}

try-with-resource : 암묵적으로 자원 반납, 가장 이상적인 자원 반납 방법

public class SampleResource implements AutoCloseable {
	@Override
	public void close() throws RuntimeException {
		System.out.println("close");
	}

	public void hello() {
		System.out.println("hello");
	}
}
public class SampleRunner {
	public static void main(String[] args) {
		try (SampleResource resource = new SampleResource()) {
			resource.hello(); // 리소스 사용
		}
	}
}