• Feed
  • Explore
  • Ranking
/
/
    Java baekjoon

    EOF 처리하기 (백준 3765)

    자바 백준 문제
    JavabaekjoonEOF
    k
    kimyega
    2025.04.13
    ·
    5 min read

    ✍ 백준 3765

    51065107

    줄마다 수식을 입력하면 그대로 출력하는 문제이다. (문제는 원문을 gpt로 번역하였다.)

    import java.io.*;
    
    public class Main {
      public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    
    
        StringBuilder sb = new StringBuilder();
        while (true) {
          String line = br.readLine();
          if (line.isEmpty()) break;   // 빈줄일때 break
    
          sb.append(line + "\n");
        }
        sb.deleteCharAt(sb.length() - 1);
        bw.write(sb.toString());
    
        bw.flush();
        bw.close();
        br.close();
      }
    }

    while문을 이용하여 한줄씩 읽고 빈줄일때 isEnpty() 메서드로 나가게 해서 출력하는 방식으로 짰다.

    5109

    IntelliJ에서는 실행이 잘되었는데, 백준에선 NullPointerException 에러가 떠버렸다..

    그래서 찾다보니 EOF 때문이라는 것을 알게 되었다.

    📌 EOF (End of File)

    • 입력의 끝

    • 더 이상 읽을 데이터가 없다는 신호

    • Windows 에서는 Ctrl + Z, Linux/Mac/IntelliJ 에서는 Ctrl + D 를 통해 신호를 보낼 수 있다.

    입력의 대표적인 클래스 Scanner와 BufferedReader에서의 EOF를 알아보자.

    Scanner

    import java.util.Scanner;
    
    public class Main {
      public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        while (sc.hasNext()) {   // 더 이상 읽을 값이 없으면 false 반환
          String input = sc.nextLine();
          System.out.println("입력: " + input);
        }
    
        sc.close();
      }
    }
    
    • Scanner의 hasNext() 또는 hasNextLine()메서드는 EOF를 감지할 수 있어서 더 이상 읽을 값이 없으면 false를 반환하여 while문을 벗어난다.

    • 여기서 Ctrl + D 를 누르면 EOF신호를 보내고 입력을 마칠 수 있다.

    BufferedReader

    import java.io.*;
    
    public class Main {
      public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
        String line;
        while ((line = br.readLine()) != null) { // readLine()이 null을 반환하면 EOF
          System.out.println("입력: " + line);
        }
    
        System.out.println("EOF 도달, 프로그램 종료!");
      }
    }
    
    • BufferedReader는 EOF에 도달하면 readLine() 에 null을 반환하게 된다.

    • 그래서 line이 null일때 while문을 벗어나는 조건으로 많이 쓰인다.

    • 여기서 Ctrl + D 를 누르면 EOF신호를 보내고 입력을 마칠 수 있다.

    백준과 같은 온라인 저지 시스템에서 주로 파일 입력(또는 스트림 입력) 방식으로 동작하기 때문에 EOF 처리를 자동으로 해준다.

    그렇기 때문에 EOF신호를 받은 while문에서 EOF처리를 해줘야 하는것이다.

    다음은 EOF처리를 한 코드이다.

    import java.io.*;
    
    public class Main {
      public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    
    
        StringBuilder sb = new StringBuilder();
        
        while (true) {
          String line = br.readLine();
          if (line == null || line.isEmpty()) break;    // EOF와 빈줄 처리 
          sb.append(line + "\n");
        }
    
        sb.deleteCharAt(sb.length() - 1);
        bw.write(sb.toString());
    
        bw.flush();
        bw.close();
        br.close();
      }
    }

    이렇게 하면 EOF처리와 빈줄까지 처리가 가능하다.

    while문 안에서 (line = br.readLine()) != null || line.isEmpty() 로 처리해 주어도 상관없다.

    📚마무리

    • 더 이상 읽을 데이터가 없으면, 입력의 끝에 해당하는 EOF 신호를 보낼 수 있다.

    • Scanner는 hasNext()나 hasLine()을 false로, BufferedReader는 readLine()을 null로 반환한다.

    • 백준과 같은 시스템은 파일입력방식으로 동작해 EOF 신호를 자동으로 보내주기 때문에 꼭 처리해 주어야 한다.







    - 컬렉션 아티클