일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 쿼리
- HTTP
- server
- 어노테이션
- SpringSecurity
- spring
- 스프링오류
- 시큐리티
- SQL
- JWT
- 스프링시큐리티
- 스웨거
- 오버라이딩
- 자바
- MariaDB
- 상태코드
- HTTP상태코드
- Swagger
- API
- 인텔리제이오류
- 스프링
- 의존성주입
- Static
- Java
- restAPI
- RDBMS
- 스프링RESTAPI
- 서버
- JPA
- application.yml
- Today
- Total
취뽀몽
[Java] try-with-resources 본문
자바 7 이전에는 일반적으로 예외처리를 하기 위해 try-catch-finally 구문을 사용하였다.
예외가 발생할 가능성이 있는 코드를 try 블록 안에 작성하고, 해당 예외를 처리하기 위한 catch 블록을 사용한다.
finally 블록은 예외 발생 여부와 상관없이 항상 실행되며 일반적으로 finally 블록은 리소스 해제나 정리 작업에 사용된다.
try-catch-finally 구문은 다음과 같이 사용한다.
import java.io.*;
public class Main {
public static void main(String[] args) {
FileWriter file = null;
try {
file = new FileWriter("file.txt");
file.write("안녕하세요");
} catch (IOException e) {
System.out.println("파일을 읽을 수 없습니다 : " + e.getMessage());
} finally {
file.close();
}
}
}
구문을 제대로 작성했지만, 위의 코드는 컴파일 에러가 발생한다.
file.close() 라는 동작이 예외가 발생할 수 있기 때문에, 예외처리를 해줘야 하기 때문이다.
그렇기 때문에 최종적으로 다음과 같이 코드를 작성해야 한다.
import java.io.FileWriter;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
FileWriter file = null;
try {
file = new FileWriter("file.txt");
file.write("안녕하세요");
} catch (IOException e) {
System.out.println("파일을 읽을 수 없습니다 : " + e.getMessage());
} finally {
try {
file.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
한 눈에 봐도 가독성이 안 좋아보이는 코드이다.
이러한 문제를 개선하기 위해 자바 7 이후에 try-with-resources를 지원하게 되었다.
try-with-resources는 자원을 자동으로 해제하기 위해 사용된다.
이 구문을 사용하면 AutoCloseable 인터페이스를 구현한 리소스를 자동으로 해제할 수 있다.
try-with-resources 문은 finally 블록을 명시적으로 작성하지 않아도 된다.
try-with-resources 문은 입출력에 사용한 객체를 자동으로 반환시켜주기 때문에 입출력과 관련된 클래스를 사용할 때 유용하다.
try 블록에 괄호()를 추가하여 파일을 열거나 자원을 할당하는 명령문을 명시하면, 해당 try 블록이 끝나자마자 자동으로 파일을 닫거나 자원을 해제해준다.
위의 예제코드를 try-with-resources를 사용하여 바꿔보자.
import java.io.FileWriter;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
try (FileWriter file = new FileWriter("file.txt")) {
file.write("안녕하세요");
} catch (IOException e) {
System.out.println("파일을 읽을 수 없습니다: " + e.getMessage());
}
}
}
괄호 안에 객체를 생성하면 따로 close() 를 호출하지 않아도 try 블럭을 벗어나는 순간 자동적으로 close() 가 호출된다.
그 이후에 catch 블럭 또는 finally 블럭이 수행된다.
try 블록이 끝나면 FileWriter 리소스가 자동으로 닫히므로, finally 블록을 따로 작성하지 않아도 된다.
try-with-resources 문이 AutoCloseable 인터페이스를 구현한 리소스를 자동으로 해제할 수 있다고 했는데,
여기서 AutoCloseable 인터페이스란 뭘까?
AutoCloseable 인터페이스는 자바 7부터 도입된 인터페이스로, 자원을 자동으로 닫을 수 있는 메커니즘을 제공하기 위해 사용한다. AutoCloseable 인터페이스는 하나의 추상 메서드인 close()를 정의하고 있다.
AutoCloseable 인터페이스를 구현한 클래스는 리소스를 사용한 후에 close() 메소드를 호출하여 해당 리소스를 명시적으로 닫을 수 있다.
리소스는 파일, 네트워크 연결, 데이터베이스 커넥션 등의 외부자원이 될 수 있다.
close() 메소드를 호출하면 리소스는 안전하게 정리되고 해제된다.
try-catch-finally 구문보다는 try-with-resources 구문을 쓰는 것이 좋아보인다!
'java' 카테고리의 다른 글
[Java] Optional (0) | 2024.01.01 |
---|---|
[Java] Enum 클래스 (0) | 2023.11.27 |
[Java] 함수형 인터페이스 (Functional Interface) (0) | 2023.10.21 |
[Java] Checked Exception과 Unchecked Exception (0) | 2023.10.11 |
[Java] 쓰레드 풀(Thread Pool) (0) | 2023.10.04 |