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
'개발 이야기 > Java' 카테고리의 다른 글
[Effective Java-ITEM 2] Builder (0) | 2022.09.26 |
---|---|
[Effective Java-ITEM 1] 정적 팩토리 메소드 (0) | 2022.09.15 |
Collection Interface로 업캐스팅을 하는 이유 (0) | 2022.05.26 |
강한 결합과 약한 결합 (0) | 2022.05.18 |