JAVA

JAVA System.in에서의 EOF(End of File) 컨트롤

Ambitions 2020. 12. 23. 14:17

저번 글에서 BufferdReader와 Scaner에 대해서 정리했었는데, 알고리즘 문제풀이에서 주로 사용하기 때문에 정리했었다.

그런데 알고리즘 문제 풀이중에서 종종 input종료 조건에 대한 지문이 없는경우가 있는데, 이 글을 쓰기 전 까진 그냥 무한루프를 돌리는 건가? 라고 생각하고 디버깅을 시도했는데, 결과는 당연히 런타임에러였다. 

이후 문제를 자세히 읽어보니 EOF라는 키워드가 있어서 EOF에 대해서 찾아보고 정리하려고 한다.

 

먼저 EOF는 End Of File 약어로 데이터로부터 더이상 읽을 수 있는 소스가 없다라는 의미로 보통 반복문의 종료시점을 설정하기 위해서 사용하는 것 같다. 이 글에서는 BufferdReader와 Scanner의 while문에서의 EOF만 정리하려고 한다. 

코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
//BufferdReader 클래스의 경우
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String a;
while((a = reader.readLine()) != null) { // a가 null이 아니면 반복 아니면 종료
    // 비지니스로직
            
}
//Scanner 클래스의 경우
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {  //외에 hasNextInt(), sc.hasNextDouble 등 여러가지 메소드도 존재함
    // 비지니스 로직
}
        
cs

사실 EOF가 무엇인지만 알게된다면 코드는 별게없는 것 같다. 다만 Scanner Class의 경우 hasNext... 가 boolean값으로 들어오기 때문에 좀 더 직관적이고 알기쉽고, BufferdReader의 경우 조건식을 넣어줘야 한다는점 외엔 어려운 점이 없다. 

이런 내용은 학부때도 들었던 것 같은데 지금와서야 정리한다니 참 공부를 게을리 했다는 생각이든다.

+ 외에 파일입출력때에도 EOF를 설정해줘야 예외가 발생하지 않는다.