EOF의 이해
문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
입력
입력은 여러 개의 테스트 케이스로 이루어져 있다.
각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)
출력
각 테스트 케이스마다 A+B를 출력한다.
예제 입력 1
1 1
2 3
3 4
9 8
5 2
예제 출력 1
2
5
7
17
7
풀이
이 문제의 핵심은 EOF를 감지하고 반복문을 탈출 하는 것 이었다..
여기서 EOF(End of File)는 파일 또는 입력 소스에서 더 이상 읽을 데이터가 없음을 나타내는 신호이다.
해당 코드에서는
if (input == null|| input.*isBlank*())이 부분을 통해 EOF를 감지하고 무한루프를 탈출 하도록 설계하였다.
입력이 없이 엔터키만 입력해 빈 줄이 있는 경우 **NumberFormatException**이 발생하는 오류가 있었는데, val (A, B) = input.split(" ").map { it.toIntOrNull() ?:0} 이 코드에서 입력이 없거나 빈 줄일 경우를 고려하여 숫자 변환을 수행하여 오류를 잡았습니다.
fun main() {
val emptyArray : Array<Int> = Array(100){0}
var i =0
while(true) {
val input = readLine()
if (input == null|| input.isBlank()) {
break
}
val (A, B) = input.split(" ").map { it.toIntOrNull() ?:0}
emptyArray[i] = A + B
i++
}
for(j:Int in 0 until i) {
println(emptyArray[j])
}
}
toIntOrNull() 함수는 문자열을 정수로 변환하려고 시도하고, 변환이 실패할 경우에는 **null**을 반환합니다. 그래서 입력이 없는 경우, 즉 빈 문자열이나 공백 문자열을 입력하면 **split(" ")**를 통해 빈 리스트가 생성되고, **map { it.toIntOrNull() ?: 0 }**에서 모든 요소는 **null**로 변환됩니다.
즉 입력이 없는 경우에는 빈 리스트가 생성되고 모든 요소가 **null**로 변환되며, input.*isBlank*() 조건문이 참이 되어 무한 루프를 탈출하게 됩니다.