[Java] Closeable vs AutoCloseable

2025. 10. 17. 10:57·JVM/Java

개요

앞에 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 을 상속받는다.

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
'JVM/Java' 카테고리의 다른 글
  • [Java] Primitive 타입보다 VO 를 의존하라
  • [Java] Clean Code - index, array 대신 Iterator
  • [Java] 제네릭과 동적 타입 캐스팅
  • [Java] 람다 캡쳐와 Synthetic 람다 클래스
M_Falcon
M_Falcon
  • M_Falcon
    Falcon
    M_Falcon
  • 전체
    오늘
    어제
    • 분류 전체보기 (432)
      • Web (16)
        • Nodejs (14)
        • Javascript (23)
        • FrontEnd (4)
      • DataBase (39)
        • Fundamental (1)
        • Redis (4)
        • PostgreSQL (10)
        • NoSQL (4)
        • MySQL (9)
        • MSSQL (3)
        • Error (4)
      • Algorithm (79)
        • Algorithm (문제풀이) (56)
        • Algorithm (이론) (23)
      • JVM (65)
        • Spring (13)
        • JPA (5)
        • Kotlin (13)
        • Java (24)
        • Error (7)
      • 기타 (5)
        • Kafka (3)
        • Kubernetes (3)
        • Docker (13)
        • git (19)
        • 잡동사니 (27)
      • 재테크 (11)
        • 세무 (4)
        • 투자 (3)
        • 보험 (0)
      • BlockChain (2)
        • BitCoin (0)
      • C (32)
        • C (10)
        • C++ (17)
        • Error (3)
      • Low Level (8)
        • OS (3)
        • 시스템 보안 (5)
      • 네트워크 (3)
      • LINUX (30)
        • Linux (26)
        • Error (4)
      • 저작권과 스마트폰의 이해 (0)
      • 생각 뭉치 (6)
      • 궁금증 (2)
      • Private (4)
        • 이직 경험 (0)
        • 꿈을 찾아서 (1)
      • Android (21)
        • OS (4)
  • 블로그 메뉴

    • 홈
    • WEB
    • 알고리즘
    • DataBase
    • Linux
    • Mobile
    • C
    • 방명록
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    Spring
    C++
    백준
    kafka
    docker
    Bitcoin
    algorithm
    ubuntu
    Programmers
    Kotlin
    프로그래머스
    java
    linux
    알고리즘
    database
    JPA
    javascript
    PostgreSQL
    Git
    android
  • hELLO· Designed By정상우.v4.10.3
M_Falcon
[Java] Closeable vs AutoCloseable
상단으로

티스토리툴바