👉 Closeable 인터페이스
- Java에서 Closeable 인터페이스는 어떤 자원(예를 들어 파일, 네트워크 연결 등)을 사용한 후에 안전하게 닫을 수 있도록 도와주는 기능을 제공
- 이것은 특히 파일이나 네트워크 연결과 같은 시스템 자원을 사용하는 객체들에게 중요
👉 주요 기능 : 자원 닫기
- Closeable 인터페이스에는 close() 메소드가 있는데, 해당 메서드는 자원을 닫을 때 사용
- 예를 들어, 파일을 읽고 난 후에는 그 파일을 닫아야 메모리 누수 등을 방지할 수 있음
- 이렇게 시스템 자원을 해제해야 다른 프로그램이나 작업이 해당 자원을 사용할 수 있음
👉 Closeable 인터페이스를 구현한 클래스 예시
- 파일 입출력 클래스
FileInputStream
: 파일에서 바이트 단위로 데이터를 읽어들이는 데 사용
FileOutputStream
: 파일에 바이트 단위로 데이터를 쓰는 데 사용
FileReader
: 텍스트 파일에서 문자 단위로 데이터를 읽어들이는 데 사용
FileWriter
: 텍스트 파일에 문자 단위로 데이터를 쓰는 데 사용
- 버퍼 입출력 클래스
BufferedReader
: 텍스트 데이터를 효율적으로 읽기 위한 버퍼를 제공
BufferedWriter
: 텍스트 데이터를 효율적으로 쓰기 위한 버퍼를 제공
BufferedInputStream
: 바이트 스트림 데이터를 효율적으로 읽기 위한 버퍼를 제공
BufferedOutputStream
: 바이트 스트림 데이터를 효율적으로 쓰기 위한 버퍼를 제공
- 네트워크 클래스
Socket
: 네트워크를 통해 다른 시스템과 통신할 때 사용되는 소켓
ServerSocket
: 서버 측에서 클라이언트의 연결을 기다리는 데 사용
- 기타 스트림 클래스
ObjectInputStream
: 객체를 직렬화하여 스트림을 통해 읽는 데 사용
ObjectOutputStream
: 객체를 직렬화하여 스트림을 통해 쓰는 데 사용
👉 사용 예시(try-catch-finally)
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream("example.txt");
} catch (IOException e) {
} finally {
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
}
}
}
- 파일을 읽을 때, FileInputStream 같은 클래스를 사용
- 이 클래스는 Closeable 인터페이스를 구현하기 때문에, close() 메소드를 사용하여 파일을 닫을 수 있음
- try-catch-finally
- try 블록에서 코드를 실행하고, catch 블록에서 예외를 처리하며, finally 블록에서 자원을 해제
- finally 블록에 있는 코드는 try 블록 내에서 예외 발생 여부와 상관없이, catch 블록 내에서 예외 처리 여부와 상관없이 항상 실행됨
👉 try-with-resources와 Closeable
try (FileInputStream files = new FileInputStream("example.txt")) {
} catch (IOException e) {
}
- Java 7 이상에서는 try-with-resources라는 기능을 사용할 수 있음
- ⇒ Closeable 인터페이스나 AutoCloseable 인터페이스를 구현하는 자원을 자동으로 닫아주는 기능
- try-with-resources를 사용하면 finally 블록에서 직접 close()를 호출할 필요가 없음
- 사용 방법
👉 Closeable을 구현하지 않은 자원의 관리
- 해당 클래스에서 구현한 자원 해제 메서드가 있는지 확인
- 직접 메서드를 정의하는 방법도 있음
- 아니면 해당 자원에 대한 참조를 null로 설정하거나 자원을 닫는데 필요한 특정 메서드를 호출