민스씨의 일취일장

rTcl | Java 빈줄 (EOF) 처리 - null vs. isEmpty() vs. isBlank() 본문

Programming Language & Framework/JAVA & Spring

rTcl | Java 빈줄 (EOF) 처리 - null vs. isEmpty() vs. isBlank()

읻민스 2025. 2. 8. 14:11
반응형

자바 빈줄처리에 대한 글이다.

Java - 빈줄 처리

rTcl - Java EOF Control - null isEmpty isBlank 썸네일 이미지이다.
rTcl - Java EOF Control - null isEmpty isBlank

백준 문제를 풀다보면 마지막 입력이 더이상 없으면 연산을 멈추는 방식으로 문제가 나오는 경우가 있다. 이 때 필요한 것이 빈줄 혹은 EOF (End Of File)을 처리할 수 있어야 한다. 매번 감으로만 하다가 확실히 알아보기 위해 하나하나 살펴보려고 한다.

📌 처리대상

일단 BufferedReader를 이용해 문자열을 받는다.

String str = br.readLine();

이렇게 입력받은 문자열을 비교해 while문을 작성할 것이다.

📌 입력 예시

YdMins is a web fullstack engineer.
Full-stack covers not only front- and backend, but also DevOps.

!=null을 이용한 처리

일단 정답이면서 가장 기본적인 방식인 null 비교를 이용해 보겠다. !=null은 null인지 여부를 판단한다.

String str;
while((str = br.readLine()) != null){
	System.out.println("executed in the while loop");
}

처리 결과

executed in the while loop
executed in the while loop

!=null 특징

  • br.readLine()이 EOF에 도달하면 null을 반환하므로 while문이 종료된다.
  • ""(빈줄), " "(공백) 모두 null이 아니므로 while문이 실행된다.
입력 while 반복문 실행 여부
Hello World ✅ (not null)
" " ✅ (not null)
"" ✅ (not null)
  백준에서 : ❌ (EOF)
IDE : ⚠️ while 루프가 끝나지 않는다. (EOF 처리가 안되어 있음)

isEmpty()를 이용한 처리

String 클래스의 메소드인 isEmpty()를 이용한 처리에 대해서 살펴보자. isEmpty() ""(빈줄)인지를 판단한다.

String str;
while(!(str = br.readLine()).isEmpty()){
	System.out.println("executed in the while loop");
}

처리 결과

Runtime Exception - NullPointerException

isEmpty() 특징

  • ""(빈줄)인지 아닌지를 판단한다.
  • " "(공백)을 인식한다.
  • EOF는 null인데, null은 판단 대상이 아니기 때문에 NullPointerException을 던진다.
입력 while 반복문 실행 여부
Hello World ✅ (not "")
"" ❌ (not "")
" " ✅ (not "")
  백준에서 : ⚠️ NullPointerException
IDE : ⚠️ while 루프가 끝나지 않는다. (EOF 처리가 안되어 있음)

isBlank()를 이용한 처리

String 클래스의 메소드인 isBlank()를 이용한 처리에 대해서 살펴보자. isBlank()는 " "(빈칸)인지를 판단한다.

String str;
while(!(str = br.readLine()).isBlank()){
	System.out.println("executed in the while loop");
}

처리 결과

Java >= 11 : RuntimeException - NullPointerException
Java < 11 : Compile Error

isBlank() 특징

  • 문자열이 있는지 여부를 판단한다.
  • " "(공백), ""(빈줄) 모두 true를 반환한다.
  • EOF는 null인데, null은 판단 대상이 아니기 때문에 NullPointerException을 던진다.
입력 while 반복문 실행 여부
Hello World ✅ (exists character)
"" ❌ (none of character)
" " ❌ (none of character)
  백준에서 : ⚠️ NullPointerException
IDE : ⚠️ while 루프가 끝나지 않는다. (EOF 처리가 안되어 있음)

⚠️ IDE에서는 NullPointerException 없이 while 루프가 끝나지 않는다

하지만 위와 같은 코드를 IDE에서 실행하면 NullPointerException가 발생하지 않고, while 루프도 끝나지 않는다. 하지만 백준에 코드를 제출하면 NullPointerException이 발생한다.

백준 문제 제출 결과 모습이다.
백준 문제 제출 결과

이유는 입력을 받을 떄 사용하는 System.in 때문이다. 백준에서는 입력이 끝나면 EOF 처리를 해준다. 하지만 우리가 작성한 코드에서 단순 입력이 System.in을 종료시키지 못하고, System.in은 사용자 입력을 대기한다. 따라서 while문이 끝나지 않는 것이다.

정리

  • 백준 : br.readLine()은 EOF에서 null을 반환한다.
  • IDE : 입력 끝이 EOF를 의미하지 않고, 입력을 위해 사용한 System.in은 다음 입력을 대기하기 떄문에 while loop가 끝나지 않는다.
  • is.null은 null인지 아닌지 여부를 판단한다.
  • is.Empty()는 "" 빈 줄인지 아닌지 여부를 판단한다.
  • is.Blank()는 공백을 제외한 문자가 있는지 여부를 판단한다.
728x90
반응형