본문 바로가기
java

java.io. close() 해줘야 하는 이유!

by 코디드 2023. 1. 16.
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamTest {

	public FileOutputStreamTest() {
		//  FileOutputStream : byte 단위로 파일 쓰기
		try {
			File file = new File("C://java_test", "my_data.txt");
			
			FileOutputStream fos = new FileOutputStream(file);
			
			String[] inData = {"자바에서 문자열을","파일로 쓰기 연습중\n","FileOutputStream 객체 활용함."};
			for(String data : inData) {
				// 문자열 -> byte[]
				fos.write(data.getBytes());
			}
			fos.close();
		}catch(IOException ie) {
			ie.printStackTrace();			
		}
	}
	public static void main(String[] args) {
		new FileOutputStreamTest();
	}
}

  수업시간에 강사님께서 수업 끝날때 쯤에 FileOutputStreamTest.java 에서 "객체명.close() (아래서부터 다섯번째줄)를 써주는게 좋다" 고 말씀하셨다. 분명에 이전에 InputStream 이나 OutStream에 대해서 설명하실 때 안쓰셨기 때문에 굳이 안써도 오류가 나지 않는다는 얘긴데 왜 써야할까 의문이 생겨서 찾아봤다.

 

두 줄로 요약하자면,
      1.리소스 낭비를 막기 위해 닫아준다.
      2.지금 당장 오류가 안 생긴다고 해서 생략하지 말고 하라는 대로 해라. 로 정리할 수 있다.


  https://blog.jiniworld.me/11
"자바 라이브러리 중에는, close메서드로 직접 닫아줘야하는 resource가 많다.
( 예를들면 입출력 관련 자원들인 InputStream, OutputStream, Connection ... )
이 때, close를 처리하지 않으면 성능 저하의 문제를 일으키기에 반드시 닫아줘야 한다.
프로그램 실행 중에 에러가 발생되었다 하더라도 close 처리는 반드시 처리가 되어야 한다."


  https://okky.kr/articles/289827
  https://okky.kr/articles/138656
"close는 기본 원칙입니다. 지금 당장 문제가 없다고 느끼신다고 해서 평생 문제가 없는건 아니니까요. 또한, 자신의 지식안에서만 테스트해서 정상이라고 해서 그게 정상인것도 아닙니다.
해당 클레스에서 특정 Rule을 만들었다면 당연히 그 Rule을 따르는게 그나마 위험요소가 적은 방법입니다.
....
입력 스트림은 성격상 오픈하셨어도 다른 곳에서 사용이 가능하도록 되어 있습니다. 그렇기 때문에 close하지 않으셨어도 타 쓰레드에서 접근이 가능할 것입니다. 다만, close하지 않고 JVM도 종료되지 않은 상태를 장기적으로 유지하신다면... 사용하는 OS와 JVM벤더사에 따라서는 다양한 형태의 장애가 발생할 수 있습니다. 입력 스트림의 close는 연관된 리소스 해제가 주 기능이기때문에 가장 일반적으로 볼 수 있는 오류는 아무래도 스트림 리소스 부족현상일 것입니다. 굳이 메모리 관련 오류가 보고 싶으시다면 메모리와 관련된 리소스를 사용하는 곳에 이용하시면 메모리 오류를 볼 수 있으리라 봅니다만.. 역시 OS나 JVM벤더사에 따라서는 나름대로 방어 기능들이 있기때문에 OS와 JVM벤더사및 버전에 따라 현상이 다를거라 봅니다만...
단순히 입력 스트림을 사용하기보다는 메모리 관련된 입력 스트림의 경우에는 메모리를 조금씩 이용한 후 해제가 발생하지 않았기 때문에 발생 확률은 높아질거라 추측합니다."