자바에서 외부 자원을 안전하게 다루기 위해 도입된 try-with-resources와 AutoCloseable 인터페이스에 대해 알아보겠습니다.
1. try-with-resources
try-with-resources 문은 자원을 사용한 후 자동으로 close() 메소드를 호출하여 안전하게 리소스를 해제해주는 기능입니다. 이를 사용하기 위해서는 해당 리소스 객체가 AutoCloseable 인터페이스를 구현하고 있어야 합니다.
예시:
try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
위의 예시에서는 BufferedReader 객체를 사용하여 파일을 읽고 있습니다. try-with-resources 문을 사용하면 try 블록을 빠져나갈 때 자동으로 BufferedReader의 close() 메소드가 호출되어 리소스를 안전하게 해제합니다.
2. AutoCloseable 인터페이스
AutoCloseable 인터페이스는 자바 7부터 도입되었으며, 단일 메소드인 close()를 정의하고 있습니다. 이 인터페이스를 구현한 클래스는 자원을 안전하게 해제하기 위해 try-with-resources와 함께 사용될 수 있습니다.
예시:
public class MyResource implements AutoCloseable {
public void useResource() {
// 자원 사용
}
@Override
public void close() throws Exception {
// 리소스 해제
}
}
위의 예시에서는 MyResource 클래스가 AutoCloseable 인터페이스를 구현하여 자원을 안전하게 해제할 수 있도록 합니다. 이 클래스를 try-with-resources 문과 함께 사용하면 리소스를 안전하게 관리할 수 있습니다.
3. try-with-resources의 장점
간결한 코드: try-with-resources를 사용하면 코드가 더 간결해지고 가독성이 좋아집니다. 또한 예외 처리 코드를 명시적으로 작성하지 않아도 됩니다.
자동 리소스 관리: try-with-resources 문을 사용하면 예외 발생 여부에 관계없이 자원을 안전하게 해제할 수 있습니다. 이는 메모리 누수와 같은 문제를 예방할 수 있습니다.
4. try-catch-finally와의 비교
try-catch-finally: 리소스를 해제하는 코드가 finally 블록에 위치하므로, 코드가 길어지고 가독성이 떨어질 수 있습니다. 또한 리소스 해제를 놓칠 수 있는 실수가 발생할 수 있습니다.
FileReader fileReader = null;
try {
fileReader = new FileReader("/Users/veneas/Desktop/dev/test.txt");
Scanner sc = new Scanner(fileReader);
while(sc.hasNextLine()) {
System.out.println(sc.nextLine());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (fileReader != null) {
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
try-with-resources: try-with-resources를 사용하면 자원을 사용한 후 자동으로 close() 메소드가 호출되므로, 코드가 간결해지고 가독성이 향상됩니다. 또한 예외 처리와 리소스 해제가 한 곳에서 처리되므로 코드의 유지보수성이 향상됩니다.
try (FileReader fileReader = new FileReader("/Users/veneas/Desktop/dev/test.txt")) {
Scanner sc = new Scanner(fileReader);
while(sc.hasNextLine()) {
System.out.println(sc.nextLine());
}
} catch (IOException e) {
e.printStackTrace();
}
AutoCloseable을 구현하지 않은 클래스의 인스턴스를 try-with-resources 구문에 사용하더라도 해당 인스턴스는 자동으로 닫힙니다. 하지만 클래스가 AutoCloseable을 구현했다면 close() 메소드가 호출되어 리소스가 닫히게 됩니다.
try-with-resources, AutoCloseable:
import java.io.*;
// AutoCloseable을 구현한 사용자 정의 클래스
class MyResource implements AutoCloseable {
// 리소스를 닫을 때 수행할 작업 정의
@Override
public void close() throws Exception {
System.out.println("MyResource가 닫혔습니다.");
}
// 다른 동작을 수행하는 메서드
public void doSomething() {
System.out.println("MyResource가 무언가를 수행합니다.");
}
}
public class AutoCloseableExample {
public static void main(String[] args) {
try (MyResource resource = new MyResource()) {
// 리소스 사용
resource.doSomething();
} catch (Exception e) {
e.printStackTrace();
}
}
}
위의 코드에서 MyResource 클래스는 AutoCloseable 인터페이스를 구현하고 있습니다. main 메소드에서는 try-with-resources 구문을 사용하여 MyResource 객체를 생성하고 사용합니다. 이 구문을 사용하면 리소스는 try 블록이 종료될 때 자동으로 닫힙니다. 따라서 close() 메소드가 호출되고 "MyResource가 닫혔습니다."가 출력됩니다.
'JAVA' 카테고리의 다른 글
Java 버전에 따른 주요 기능(8~19) (3) | 2024.03.07 |
---|