Test 문제를 풀면 Scanner 클래스는 계속하여 사용 하게 되는데,
이때, next() 와 nextLine()을 사용하다가 발생하는 문제에 대해 정리를 해보았다.
Scanner 클래스의 메서드는 아래와 같다.
next()
nextLine()
nextByte()
nextShort()
nextInt()
nextLong()
nextDouble()
close()
등..
이런식으로 이클립스에서 확인해 볼 수 있다.
현재 주로 사용하는 메서드는
next()
nextLine()
nextInt()
등인데,
nextLine() 을 사용하다가 문제가 자주 발생했다.
예를들어 아래와 같이 코드를 짰을 경우에,
사용자로부터 num은 잘 입력받다가
str값을 입력 하기 전에 입력이 종료되어 바로 출력값이 나오는 것을 확인 하게 된다.
이런 오류가 발생 하는 이유 :
nextLine()은 개행문자 \n을 포함하여 입력을 받는다.
nextInt()는 입력값 1을 받고, 엔터키를 입력하면
Buffer에 1\n이 올라가고
개행문자를 제외하고 1 만 가져 온다.
근데, Buffer에 개행문자 \n이 남아있으므로,
nextLine()은 개행문자를 포함하여 입력을 받기 때문에
\n을 가져오게 된다.
즉, 엔터키를 가져오니 엔터가 쳐져서 str 입력을 못하고 넘어가 버리는 것이다.
해결 방법 :
1. next() 와 nextLine() 를 같이 쓸 수 있는 상황이면,
nextLine() 이전에 입력 받는 값을 고려하여 next()로 대체 하기.
2. nextLine()을 뒤에 써야한다면 Buffer를 정리하기 위한 nextLine()을 실행해주는 방법이 있다.
정상적으로 입력이 되는 모습을 확인.
결론 :
next()와 nextLine() 둘다 문자열을 받을 수 있는 메서드 이지만
nextLine()이 개행문자를 포함하여 받아온다는 차이가 있다.
space와 같은 공백문자를 포함하여 입력 값을 받고 싶은 경우
nextLine()을 사용 해야 하기 때문에, 성능상으로는 nextLine()가 우위에 있다고 할 수 있다.
추가 :
메인함수에서 사용자로부터 입력을 2번 이상 받는 상황일 때
nextInt() 등과 nextLine()을 다 사용 해야 한다면
nextInt() 등을 사용 한 후 바로 버퍼값 제거를 위해 nextLine()을 사용하기.