스트림 안전하게 닫기
try-with-resources
스트림 안전하게 닫기은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
스트림을 닫아야 하는 이유
BufferedReader와 같은 스트림은 파일 핸들, 메모리 버퍼, 연결과 같은 시스템 자원을 점유합니다. 스트림을 전혀 닫지 않으면 이러한 자원이 누수될 수 있습니다.
스트림을 닫으면 스트림이 점유하던 자원이 해제되고 대기 중인 데이터가 모두 전송됩니다. 이 단원에서는 스트림을 안전하게 닫는 방법을 보여 드립니다.
close 메서드
모든 리더에는 close() 메서드가 있습니다. 이 메서드를 호출하면 자원이 해제됩니다.
System.in을 감싸는 BufferedReader를 닫으면, 감싸고 있던 기반 스트림도 함께 닫힙니다.
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
// ... use br ...
br.close();예전의 위험한 방법
close()를 수동으로 호출할 수도 있지만, 해당 줄이 실행되기 전에 오류가 발생하면 close()가 건너뛰어져 자원이 누수됩니다.
close()를 finally 블록에 넣으면 도움이 되지만, 코드가 장황해지고 잘못 작성하기 쉽습니다.
BufferedReader br = null;
try {
br = new BufferedReader(
new InputStreamReader(System.in));
// ... use br ...
} finally {
if (br != null) br.close();
}try를 사용한 자원 자동 관리
Java에는 더 깔끔한 해결책인 try를 사용한 자원 자동 관리가 있습니다. try 뒤의 괄호 안에 스트림을 선언하면, Java가 블록이 끝날 때 스트림을 자동으로 닫습니다. 오류가 발생하는 경우에도 마찬가지입니다.
finally도 필요 없고 수동으로 close()를 호출할 필요도 없습니다. 이것이 현대적인 권장 방식입니다.
try (BufferedReader br =
new BufferedReader(new InputStreamReader(System.in))) {
String line = br.readLine();
System.out.println(line);
}작동 원리
try (...) 괄호 안에 선언하는 모든 자원은 AutoCloseable을 구현해야 합니다. BufferedReader는 이를 구현하므로 Java가 대신 해당 객체의 close()를 호출합니다.
블록이 정상적으로 끝나든 예외로 끝나든, 블록 실행이 끝난 후에 닫기 작업이 수행됩니다.
전체 예제
다음은 try를 사용한 자원 자동 관리로 한 줄을 읽는 완전한 프로그램입니다. 블록이 끝나면 리더가 자동으로 닫힙니다.
System.in에서 읽으므로 입력을 기다리며, 여기에서는 자동으로 실행할 수 없습니다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
try (BufferedReader br = new BufferedReader(
new InputStreamReader(System.in))) {
String name = br.readLine();
System.out.println("Hi " + name);
}
}
}문자열 리더를 사용한 실행 가능한 예제
키보드 입력 없이도 try를 사용한 자원 자동 관리가 작동한다는 것을 확인하기 위해, 여기에서는 StringReader에서 읽습니다. 완전히 실행 가능한 예제입니다.
블록이 끝나면 리더가 자동으로 닫히므로, close() 호출을 직접 작성하지 않습니다.
import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
try (BufferedReader br =
new BufferedReader(new StringReader("done"))) {
System.out.println(br.readLine());
}
}
}여러 자원
하나의 try에 여러 자원을 선언할 수 있으며, 각 선언은 세미콜론으로 구분합니다. Java는 선언된 순서의 반대 순서로 모든 자원을 닫습니다.
여러 스트림을 서로 감쌀 때 유용합니다.
try (InputStreamReader isr =
new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr)) {
System.out.println(br.readLine());
}입출력 예외 처리
읽기 작업에서는 IOException이 발생할 수 있습니다. try를 사용한 자원 자동 관리 블록에 catch를 추가하면 throws를 선언하는 대신 이 예외를 처리할 수 있습니다.
catch가 실행되기 전에 자원은 여전히 자동으로 닫힙니다.
try (BufferedReader br = new BufferedReader(
new InputStreamReader(System.in))) {
System.out.println(br.readLine());
} catch (IOException e) {
System.out.println("Read failed");
}System.in을 닫아야 할까요?
한 가지 주의할 점이 있습니다. System.in의 리더를 닫으면 System.in 자체도 닫히며, 다시 열 수 없습니다.
짧은 프로그램에서는 문제가 되지 않습니다. 하지만 나중에 콘솔 입력이 더 필요하다면 해당 리더는 닫지 마세요. 스트림이 무엇을 감싸고 있는지 알고 있어야 합니다.
권장 사항
스트림을 안전하게 처리하려면 다음을 따르세요.
- 수동으로
close()를 호출하기보다 try를 사용한 자원 자동 관리를 우선하세요. - 오류가 발생하더라도 자원이 자동으로 닫힙니다.
System.in의 리더를 닫으면 표준 입력도 닫힌다는 점을 기억하세요.
자원을 깔끔하게 처리하면 누수와 버그를 방지할 수 있습니다.
간단한 확인
try를 사용한 자원 자동 관리의 가장 큰 이점이 무엇인지 생각해 보세요.
정리
스트림을 닫아야 하는 이유, 수동으로 닫거나 finally를 사용하는 위험한 방식, 그리고 AutoCloseable 자원을 자동으로 닫는 깔끔한 try를 사용한 자원 자동 관리 패턴을 배웠습니다.
이제 처음부터 끝까지 BufferedReader로 입력을 안전하게 읽을 수 있습니다.
자주 묻는 질문
“스트림 안전하게 닫기” 강의는 무료인가요?
네 — “스트림 안전하게 닫기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“스트림 안전하게 닫기”에서 뭘 배우나요?
try-with-resources 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Java Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“스트림 안전하게 닫기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- BufferedReader를 사용하는 이유
- 행 읽기
- 입력에서 숫자 파싱하기
- 스트림 안전하게 닫기