개요
앞에 Auto 라는 접두사 차이가 있다.
언제 무슨 인터페이스를 쓰는게 적절한지 선택할 수 있도록 차이점을 알아본다.
Closeable
public interface Closeable extends AutoCloseable {
public void close() throws IOException;
}
스트림을 닫고 리소스 사용을 중단하는 행위를 정의한다.
이 인터페이스를 구현하는 클래스에는FileInputStream, FileOutputStream 등이 있다.
IOException
IO 동작이 실패하거니 인터럽트가 발생함을 알리는 예외FileNotFoundException, UnsupportedEncodingException 등이 있다.
Idempotent
Close 는 반드시 멱등성을 보장해야한다.
즉, 여러번 close() 메소드를 호출해도 사이드 이펙트가 없어야한다.
AutoCloseable
Closeable은 I/O 관련 리소스를 회수하기 위해 만들어진 API다.
AutoCloseable은 I/O 외에 다른 리소스(DBConnection, Process 등)를 닫을 때도 쓸 수 있다.
interface AutoCloseable {
void close() throws Exception;
}
AutoCloseable를 구현한 클래스는 try-with-resources 절 사용시 자동으로 'close()'가 호출된다.
import java.lang.Process
ProcessBuilder pb = new ProcessBuilder("echo", "Hello");
try (Process process = pb.start()) {
process.getInputStream().transferTo(System.out);
}
프로세스 사용 완료시 자동으로 프로세스를 close 한다.
Closeable 도 try-with-resources 를 사용할 수 있다.
Closeable 이 지원된 jdk 1.5 에는 try-with-resources 문이 없었다.
try-with-resources 는 jdk 1.7 부터 지원하기 시작했다.
Closeable 을 구현한 클래스에서도 try-with-resources 를 지원하기 위해 Closeable 은 AutoCloseable 을 상속받는다.

Exception
close() 호출에 실패했을 때 발생된다.
close() 메소드 구현시 구체적인 예외를 명시하길 권장한다. close() 내에서 예외 발생이 불가한 경우 당연 예외 명시가 불필요하다.
Idempotent
close() 메소드 구현시 멱등적임을 보장하지 않아도 된다.
다만, 강력하게 멱등성을 보장하길 권장한다.
비교 요약
| 구분 | Closeable | AutoCloseable |
|---|---|---|
| Java Version | 1.5 ~ | 1.7 ~ |
| Resource Type | I/O | Any |
| Exception | IOException | Exception |
| Idempotence | true | recommended |
결론
우선적으로 AutoCloseable을 먼저 고려하라.
try-with-resources 사용할 수 있다.
IOException 외에도 다양한 Exception 으로 예외처리 할 수 있다.
'JVM > Java' 카테고리의 다른 글
| [Java] Primitive 타입보다 VO 를 의존하라 (0) | 2025.11.20 |
|---|---|
| [Java] Clean Code - index, array 대신 Iterator (0) | 2025.11.19 |
| [Java] 제네릭과 동적 타입 캐스팅 (0) | 2025.10.16 |
| [Java] 람다 캡쳐와 Synthetic 람다 클래스 (0) | 2025.02.19 |
| [Java] OutOfMemory 잡기 (0) | 2025.01.28 |