EOF 처리하기 (백준 3765)

자바 백준 문제
JavabaekjoonEOF
avatar
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 신호를 자동으로 보내주기 때문에 꼭 처리해 주어야 한다.







- 컬렉션 아티클