Try - With - Resource

2022. 12. 4. 13:04자바멘토링

try with resource는 자바 7버전 부터 사용가능하게 나왔다.

autocloseable 인터페이스를 상속 받는 
친구들만 사용이 가능하다.

ex)class FileWriter, BufferedInputStream 등

리소스를 사용할때 close()가 꼭 필요한 작업에서 사용시 유리하다.

 

 

 

Try - Catch -Finally 

package main99;

import java.io.FileWriter;
import java.io.IOException;

public class FileWriterTest {
	public static void main(String[] args) {//코드가 지저분 하다.
		
		String txt ="테스트 입니다!!";
		String fileName = "손흥민.txt";
		
		FileWriter f = null;//null검사
	
		try {
			
			 f = new FileWriter(fileName);
			 f.write(txt);
			 
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//만약에 f가 null이 아니라면
			if( f !=null) {
				
				try {
					f.close(); //따로 close();자원을 반납으로 해줘야 메모리 누수 발생하지 않는다.
				}catch (Exception e) {
					// TODO: handle exception
					e.printStackTrace();
				}
				
			}
		}
		 
	
		 
		 
	}

}

 

Try-With-Resource

package main99;


  
  import java.io.FileWriter;
  
  public class TryWithResource { 
	  public static void mian(String [] args) {
  
			String txt ="테스트 입니다!!";
			String fileName = "손흥민.txt";
			  
		try( FileWriter f = new FileWriter(fileName)){//바로 객체 생성, close();안해줘도 자원 반납된다.
			f.write(txt);
	  	}catch (Exception e) {
	  		// TODO: handle exception
		  e.printStackTrace();
  
		  }
  
  
  }
  
  
  }

 

 

 

 AutoCloseable 구현

  • AutoCloseable을 implments 해서 try-with-resource를 활용할 수 있습니다.
  • close()를 오버라이딩하여 구현합니다. 
package main99;

public class MyResource implements  AutoCloseable{

	public void doSomething() {//리소스에서 메소드 하나를 제공해 준다. 
		System.out.println("Do something");
		//에러를 던질 수 있다.
		throw new FirstError();
	}
	
	
	@Override
	public void close() throws Exception {
		// TODO Auto-generated method stub
		System.out.println("Close My Resource");
		throw new  SecondError();
	}//try -with-resource

}
package main99;

public class FirstError extends RuntimeException {

}
package main99;

public class SecondError extends RuntimeException {

}

 

Try-Catch-Finally 로 구현시 

package main99;

public class AppRunner {
	
	public static void main(String[] args) throws Exception {
	MyResource myResource = new MyResource();
	try {
		myResource.doSomething();
	}finally {
			myResource.close();
		}
	}
}

 

결과: 처음 발생한 에러 부분 내용이 없다. 에러 시작 시점을 알 수 없다.

Do something
Close My Resource
Exception in thread "main" main99.SecondError
	at main99.MyResource.close(MyResource.java:16)
	at main99.AppRunner.main(AppRunner.java:10)

 

Try-With-Resource 로 구현시 

package main99;

public class AppRunner2 {//try - with- resource 로 하면 따로 close()하지 않아도된다.
	
	public static void main(String[] args) throws Exception {
	try(MyResource myResource = new MyResource()){
		myResource.doSomething();
		/* myResource.close(); */
		
	  }
	
	}
}

결과: 처음 에러가 발생한 지점을 알 수 있다.

Do something
Close My Resource
Exception in thread "main" main99.FirstError
	at main99.MyResource.doSomething(MyResource.java:8)
	at main99.AppRunner2.main(AppRunner2.java:7)
	Suppressed: main99.SecondError
		at main99.MyResource.close(MyResource.java:16)
		at main99.AppRunner2.main(AppRunner2.java:10)

참고:https://mangkyu.tistory.com/217

'자바멘토링' 카테고리의 다른 글

파일디스크립터  (0) 2022.12.18
리플렉션  (0) 2022.12.15
추상클래스  (0) 2022.12.03
Weak Reference & Soft reference  (0) 2022.12.03
Static 이란?  (0) 2022.11.27