개발 이야기/Java

Try-With-Resources를 이용한 자원 반납

올리버 2022. 5. 25. 00:19

Java7 이전에는 자원을 해제 하기 위해서 try-catch-finally를 사용하여 자원을 해제했다.

BufferedReader br = null;

try{
    br = new BufferedReader(new InputStreamReader(System.in));
    String str = br.readLine();
    
    System.out.println(str);
}catch(IOException e){
	e.printStackTrace();
}finally{
    if(br != null{
        try{
            br.close();
        }catch(Excetpion e){}
    }
}

Java7 이후에 생긴 기능 중 하나인 try-with-resources는 try 구문에서 자원을 생성하고 사용을 완료하면 자동 반납(Close)해주는 기능이다.

 

java.lang 패키지의 AutoCloseable 인터페이스를 상속받으면 try구문에서 자원을 생성할 수 있고, 사용을 완료하면 자동 반납하게 된다.

 

try-with-resources 자원 사용/반납하기

기존에 finally에서 close를 직접 해주었다면 try-with-resources를 사용하여 조금더 간결해진 코드를 확인 할 수 있다.

try 구문 옆에 생성하고 사용이 완료되면 자동으로 반납이 된다.

try(BufferedReader br = new BufferedReader(new InputStreamReader(System.in))){
    String str = br.readLine();
    
    System.out.println(str);
}catch(IOException e){
	e.printStackTrace();
}

여러개의 자원을 할당하려면 ;(세미콜론)을 붙여서 작성하면 된다.

여러개를 할당하게 되면 위에서 Top-Down으로 생성되지만, 해제는 Bottom-Up 순서로 해제가 된다.

try(BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out))){
    String str = br.readLine();
    
    bw.write(str);
    bw.newLine();
    bw.flush();
}catch(IOException e){
	e.printStackTrace();
}

AutoCloseable 상속

AutoCloseable을 상속받아서 클래스를 커스터마이징하여 사용할 경우 동일하게 자원 반납을 자동으로 해줄수 있다.

class CloseableResource implements AutoCloseable{

    private String name;
    
    public CloseableResource(String name){
        this.name = name;
        System.out.println("Created Resource : " +name);
    }

    public void useResource(){
        System.out.println("Using this Resource : " +name);
    }

    @Override
    public void close() throws Exception {
        System.out.println("Close Resource : "+ name);        
    }
}
public class Main{
    public static void main(String[] args){
        try(CloseableResource resource = new CloseableResource("customObject")){
            resource.useResource();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
#실행 결과
Created Resource : customObject
Using this Resource : customObject
Close Resource : customObject

자원을 여러개 할당할 경우 다음과 같이 나타나게 된다.

해제 시 Bottom-Up 순서로 나타난다.

public class Main{
    public static void main(String[] args){
        try(CloseableResource object1 = new CloseableResource("object1");
            CloseableResource object2 = new CloseableResource("object2")){
            object1.useResource();
            object2.useResource();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
#실행결과
#생성은 Top-Down
#반납은 Bottom-Up
Created Resource : object1
Created Resource : object2   
Using this Resource : object1
Using this Resource : object2
Close Resource : object2     
Close Resource : object1