줄 세기(백준 4806번)

문제

줄의 개수를 세는 프로그램을 작성하시오.

입력

한 줄에 최대 100글자씩 주어진다. 빈 줄이 주어질 수도 있다.

출력

입력으로 몇 줄이 주어졌는지를 출력한다.

예제 입력 1

one
and two
three

예제 출력 1

3

💻 백준 4806번 “줄 세기” Java 풀이 + NullPointerException 주의

백준 4806번 문제를 자바(Java)로 풀면서 발생할 수 있는 런타임 에러 (NullPointerException)와 입력 처리 방식에 대해 정리합니다.


📌 문제 요약

  • 여러 줄의 입력을 받는다.
  • 입력은 EOF(End Of File)까지 주어진다.
  • 줄 수를 세어서 출력한다.
  • 빈 줄도 1줄로 세야 한다.

✅ 정답 코드 (BufferedReader + EOF 처리)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int lineCount = 0;
        String line;

        while ((line = br.readLine()) != null) {
            lineCount++;
        }

        System.out.println(lineCount);
    }
}

🔍 설명

readLine()은 입력이 끝나면 null을 반환한다.

따라서 null이 아닐 동안 계속 줄을 읽으면서 줄 수를 센다.

빈 줄도 null이 아니기 때문에 정상적으로 카운트된다.

❌ 잘못된 코드 예시 (NullPointerException 발생 가능)

import java.io.*;
import java.util.Objects;

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));

        int n = 0;
        while (true){
            if (Objects.equals(br.readLine(), "")){
                break;
            } else {
                n++;
            }
        }
        bw.write(String.valueOf(n));
        bw.flush();
        bw.close();
    }
}

⚠️ 문제점

빈 문자열 ““을 만나면 종료되므로 EOF까지 모두 세지 못한다.

readLine()이 EOF에서 null을 반환하므로 Objects.equals(null, ““)에서 NullPointerException이 발생할 수 있다.

✅ 올바른 수정 방법

String line;
while ((line = br.readLine()) != null) {
    n++;
}

readLine()의 결과가 null이 아닌 동안 반복.

null 확인으로 EOF를 정확하게 처리한다.

📌 비교 요약

항목 정답 코드 잘못된 코드 EOF 처리 방식 readLine() != null readLine().equals(“”) 빈 줄 포함 여부 ✅ 포함됨 ❌ 포함되지 않음 NullPointerException 발생 가능성 ❌ 없음 ⚠️ 있음 백준 환경 적합성 ✅ 적합 ❌ 부적합

✍️ 마무리

백준처럼 EOF 입력을 사용하는 문제는 반드시 readLine() != null 방식으로 처리해야 한다.

빈 줄과 null은 다르다. null은 EOF이고, 빈 줄은 실제로 존재하는 한 줄이다.

문자열 비교 전에 null 여부를 먼저 확인해야 런타임 에러를 방지할 수 있다.

Categories:

Updated:

Leave a comment