민스씨의 일취일장
rTcl | Java 빈줄 (EOF) 처리 - null vs. isEmpty() vs. isBlank() 본문
rTcl | Java 빈줄 (EOF) 처리 - null vs. isEmpty() vs. isBlank()
읻민스 2025. 2. 8. 14:11자바 빈줄처리에 대한 글이다.
Java - 빈줄 처리
백준 문제를 풀다보면 마지막 입력이 더이상 없으면 연산을 멈추는 방식으로 문제가 나오는 경우가 있다. 이 때 필요한 것이 빈줄 혹은 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()는 공백을 제외한 문자가 있는지 여부를 판단한다.
'Programming Language & Framework > JAVA & Spring' 카테고리의 다른 글
h.o.Algorithm | Java | 백준 16916 - 문자열 포함 판독 KMP 알고리즘 (0) | 2025.02.20 |
---|---|
rTcl | Java Map은 순회가 안된다? (feat. Map.Entry) (0) | 2025.02.18 |
rTcl | Java | String indexOf()에 대해서 알아보기 (0) | 2024.12.24 |
TIssue | Spring Data JPA | 실전! 스프링 데이터 JPA | Class Projection 안되는 이슈 (0) | 2024.12.05 |
TIssue | JPA | 스프링 부트와 JPA 활용 2 - 김영한 | Fetch Join에 distinct 적용 안해도 중복 제거되는 상황 (0) | 2024.11.28 |