아이템 8 : finalizer와 cleaner 사용을 피하라
자바에서 제공하는 객체 소멸자인 finalizer와 cleaner는 여러 문제로 인해 사용을 피하는 것이 좋다. 이들은 예측 불가능한 실행 타이밍, 성능 문제, 보안 취약점 등을 내포하고 있다.
1. 예측할 수 없는 실행 타이밍
- finalizer와 cleaner는 객체가 더 이상 필요 없어졌을 때, 즉 가비지 컬렉터가 객체를 회수할 때 호출된다.
- 수행 시점이 불확실하며, 제때 실행되지 않기 때문에 즉시 수행되어야 할 작업에는 적합하지 않다. 예를 들어, 파일 닫기나 데이터베이스 연결 해제 같은 작업에 사용할 수 없다.
2. 실행 여부 보장 안 됨
- finalizer와 cleaner는 실행 여부조차 보장되지 않는다. 프로그램이 갑작스럽게 종료되면 일부 객체의 종료 작업이 수행되지 않을 수 있다.
- 이러한 이유로 상태를 영구적으로 수정하는 작업에 사용하는 것은 위험하다.
3. 심각한 성능 문제
- finalizer와 cleaner는 성능을 크게 저하시킬 수 있다. 가비지 컬렉터가 이들을 처리하는 동안, 객체를 즉시 회수하지 못하므로 GC의 효율이 떨어지며, 특히 대규모 시스템에서는 더 큰 성능 저하를 초래할 수 있다.
4. 보안 위험: finalizer 공격
- finalizer 공격이라는 보안 취약점이 존재한다. finalizer를 사용하면, 공격자가 악의적으로 객체의 종료 시점을 조작해 시스템에 심각한 보안 문제를 야기할 수 있다.
5. 대안: AutoCloseable 구현
- finalizer와 cleaner 대신, 자원 회수를 위해서는 AutoCloseable을 구현하는 것이 훨씬 더 효과적이다.
- AutoCloseable 인터페이스의 close() 메서드를 통해, 자원을 명시적으로 해제할 수 있으며, 이는 try-with-resources 구문에서 사용 가능하다.
- 또한, close 메서드에서 객체가 더 이상 유효하지 않음을 기록하여, 닫힌 후 호출 시 오류를 발생시키는 방식을 사용할 수 있다.
'Java' 카테고리의 다른 글
이펙티브 자바(Effective Java) 2장 - 아이템 10 equals는 일반 규약을 지켜 재정의하라 (0) | 2024.12.03 |
---|---|
이펙티브 자바(Effective Java) 2장 - 아이템 9 try-finally보다는 try-with-resources를 사용하라 (0) | 2024.12.03 |
이펙티브 자바(Effective Java) 2장 - 아이템 7 다 쓴 객체 참조를 해제하라 (0) | 2024.12.03 |
이펙티브 자바(Effective Java) 2장 - 아이템 6 불필요한 객체 생성을 피하라 (0) | 2024.12.03 |
이펙티브 자바(Effective Java) 2장 - 아이템 5 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (0) | 2024.12.03 |