본문 바로가기

Back/Java

try-with-resources 간략하게 알아보기

try - with - resources 관련된 글을 읽으면서 너무 이해가 안되는 부분이 있었다.

 

"자원을 해제하기 위하여..."

 

이 말이 마치 관용구처럼 사용되었다. 추상적인 표현이라고 본다.

 

정확하게 자원을 무엇을 뜻하는가?

해제를 한다는 것은 어떤 행동이 수반되는가?

 

이런 내용이 전혀 정의되어 있지 않았다.

그래서 그 부분만 알아봤고 명확한 답을 얻을 수 있었다.

 

 

 

1. 자원, resources

자바에 한정해서 말하자면 객체를 뜻한다.

객체... 자원이라고 말하다가 객체라고 말하니 의미가 명확해진다.

 

2. 해제

AutoCloseable 인터페이스의 close() 메소드를 구현한 메소드를 호출한다는 의미다.

보충 설명이 필요한데, 객체의 라이프 사이클에 대한 내용에 대한 이해가 필요하다.

객체의 라이프사이클은 간단하게 생성으로 시작하고 소멸로 끝난다.

close() 메소드는 소멸을 의미하고, new 객체()로 객체를 생성한다.

여기서 객체를 생성한다는 것을 open() 이라는 말과 동일하게 여기면 된다.

객체를 소멸한다는 것을 close() 라는 말과 동일하게 여기면 된다.

 

 

 

배경지식이 갖춰졌다면 이제야 try - with - resources 를 제대로 이해할 수 있다.

 

try - catch 구문을 확장한 것이 try - with - resources 다.

 

try {
    // var something = new SomethingClass();
    // do something
} catch (// 처리하기 원하는 예외 클래스) {
    // 처리하기 원하는 방법
}
try (// 여기에서 객체를 생성한다) {
    // try - catch 구문과는 다르게 여기에서는 객체 생성을 하지 않는다.
    // do something
} catch (// 처리하기 원하는 예외 클래스) {
    // 처리하길 원하는 방식
}

아래 코드가 try - with - resources 이며, with, resources 라는 코드는 존재하지 않는다. 단지 try에 매개변수처럼 값을 넣는 것을 with 라고 표현한 것이다.

 

두 코드의 눈에 보이는 차이는 단 하나다.

객체의 생성을 어디에서 하는가?

이것 뿐이며, with 로 처리할 경우에는 자동으로 open(), close() 메소드가 실행되는 것과 같은 의미다.

 

여기서 주의할 점은, try - with - resources 에서 생성하는 객체는 AutoCloseable() 인터페이스의 close() 메소드를 구현해야 한다는 것이다.

 

세세한 부분까지는 들어가지 않아도 큰 틀에서는 이 정도면 충분히 이해하고 활용할 수 있으리라고 본다.