0. 들어가기
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
int num1, num2;
Scanner scanner = new Scanner(System.in);
num1 = scanner.nextInt();
num2 = scanner.nextInt();
System.out.println("두 수의 합은 = " + (num1 + num2));
}
}
정수 num1과 num2를 입력받아 프린트하는 단순한 코드이다.
java.util 패키지에서 제공하는 Scanner 클래스를 scanner객체로 인스턴스화 하고, scanner객체를 사용하여 int를 입력받아 저장한다.
위 코드를 elips에서 보면 실행은 되지만 scanner 객체에 경고 문구가 떠 있다.
경고 내용은 resource leak: 'scanner' is never closed이다.
스캐너 객체를 닫지 않아서 자원 누수가 난다고 한다.
1. 해결책
scanner 객체 사용 후 scanner.close();를 해 주면 사라진다.
2. 왜 close를 해야 하지?
해결법은 알았지만 궁금증이 생긴다. 객체의 해제는 JVM 속 garbage collector가 알아서 하는 것 아니었나? 왜 오류가 뜰까?
이유는 가비지 컬렉션은 메모리만 관리할 수 있고 다른 시스템 리소스는 관리할 수 없기 때문이다.
모든 OS에는 열 수 있는 소켓, 파일 핸들, 데이터베이스 연결 등의 수에 제한이 있다. 그래서 프로그램은 사용자로부터 입력받기 위해 리소스를 획득해야 한다.
비메모리 리소스를 활용하는 클래스는 이러한 리소스를 명시적으로 할당/할당 해제하는 방법을 제공해야 한다.
scanner 객체는 사용자로부터 입력받기 위해 비메모리 리소스를 활용하기 때문에 가비지 컬렉션에서 관리하는 대상이 아니게 되는 것이다.
3. try 문
try (Scanner lineTokenizer = new Scanner(inputLine)) {
int num = inputLine.nextInt();
System.out.println(num);
}
try 문을 통해 scanner를 사용하면 try문이 종료될 때 scanner를 자동으로 close 해 준다.
close()를 직접 해 주지 않아도 된다.
'개발 > Java' 카테고리의 다른 글
[Java]자바의 Class Loader(클래스 로더)에 대해 이해해 보자 (0) | 2023.08.09 |
---|---|
[Java]자바의 JVM에 대해 이해해보자 (0) | 2023.08.09 |
[Java]자바의 반복문 (0) | 2023.07.21 |
[Java] 자바 조건문: If-else, Switch-case, Switch Expression (0) | 2023.07.21 |
[Java]자바의 연산자 (0) | 2023.07.19 |