[Java] Scanner클래스의 nextLine()과 next() 사용 시 주의점
한 줄로 입력받아 split을 이용해 배열로 처리해 줄 때 nextLine() 메서드를 쓰는 경우가 많다.
하지만, nextLine()과 next() 메서드를 함께 쓸 때, 가끔씩 원하는대로 입력되지 않는 경우가 있다.
어떤 이유 때문인지, 어떻게 해결할 수 있을 지에 대해 알아보자.
선행 지식으로 버퍼에 대한 지식이 필요하다.
데이터를 한 곳에서 다른 곳으로 전송할 때, 임시로 데이터를 보관하는 영역을 버퍼라고 한다.
즉 스캐너를 통해 키보드로 입력을 받을 경우, print로 출력을 할 경우 모두 데이터가 버퍼에 저장된다.
int a = sc.nextInt();
위 코드의 실행 과정을 살펴보자.
스캐너 클래스의 nextInt() 메서드가 실행된 직후에는 버퍼에 아무 내용도 없기 때문에
키보드로부터 입력을 기다리는 상태가 된다.
10과 엔터를 눌렀다고 해 보자.
그러면 버퍼에는 10\n이 저장된다.
스캐너는 화이트스페이스를 기준으로 입력 데이터를 나누는데,
화이트 스페이스에는 공백(space) / 탭(tab) / 엔터(\n) 가 있다.
10\n 을 입력받을 경우 엔터를 기준으로 데이터가 구분되기 때문에,
버퍼는 10을 가져오고, \n은 남겨진다.
Scanner sc = new Scanner(System.in);
으로 스캐너 클래스를 생성했다고 하자.
sc.next();
>> 입력받은 값 중 공백 전 까지 문자열로 반환한다.
sc.nextInt();
>> 입력받은 값 중 정수만을 반환한다.
(nextDouble nextFloat도 동일한 맥락)
sc.nextLine();
>> 입력받은 한 줄을 문자열로 반환한다.
여기서 한 줄이라는건, 입력의 시작부터 \n전 까지를 의미한다.
그러니 \n 전에 뭐가 있든 다 읽어올 수 있다는거다.
next() next() next() next() nextInt()...
String a1 = sc.next();
String a2 = sc.next();
int a3 = sc.nextInt();
다음 코드가 작성됐다고 하자.
asdf\nqwer\n1234\n를 입력할 시
첫 번째로 asfd가 저장되고 버퍼에는 \n이 남는다.
두 번째로 버퍼에 \n이 남아있지만, 개행문자만 남아있으니 건너뛰고 다음 입력인 qwer\n을 받아온다.
여기서 다시 qwer만 저장되고 \n은 버퍼에 남아있게 된다.
마지막 a3에도 같은 맥락으로 123이 저장된다.
엔터가 아니라 탭, 띄어쓰기에도 동일하게 적용된다.
nextLine(); nextLine(); nextLine(); nextLine();....
String a1 = sc.nextLine();
String a2 = sc.nextLine();
String a3 = sc.nextLine();
다음 코드가 작성됐다고 하자.
qwer\nasdf\nzxcv\n를 입력했다고 하면,
a1에는 qwer이 저장되고 버퍼에는 아무것도 남지 않는다.
같은 방법으로 a2에 asdf a3에 zxcv가 저장된다.
엔터 대신 탭, 스페이스바로 대신 사용할 수 없다.
next(); nextLine();
String a1 = sc.next();
String a2 = sc.nextLine();
다음 코드가 작성됐다고 하자.
qwer\nasdsf\n 을 입력하려고 하지만
qwer\n에서 실행이 멈춘다.
a1에 qwer이 저장된 다음 버퍼에는 \n가 남아있는데
nextLine()메서드는 \n를 기준으로 입력받기 때문에
a2에는 공백이 입력된다.
qwer\tasdf\n를 입력했다고 하면
a1에는 qwer이 저장되고
a2에는 \tasdf 가 저장된다.
스페이스를 넣어도 같은 결과가 나온다.
즉, next(); 다음 nextLine() 메서드를 사용할 시 의도하지 않은 결과가 나타난다.
해결책
next(); 다음에 nextLine();을 한줄 추가해 버퍼에 남아있는 \n을 지워준다.
이것 외에도 여러 가지 해결방법이 있지만, 이 방법이 가장 깔끔하다.
'Programming Language > Java' 카테고리의 다른 글
[Java] 스트림 (Stream) (0) | 2021.10.25 |
---|---|
[Java] 람다식 (Lambda expression) (0) | 2021.10.25 |
[Java] 컬렉션 프레임웍 (Collections Framework) (0) | 2021.10.19 |
[Java] 열거형 (enums) (0) | 2021.10.18 |
[Java] 지네릭스 (Generics) (0) | 2021.10.17 |
댓글
이 글 공유하기
다른 글
-
[Java] 람다식 (Lambda expression)
[Java] 람다식 (Lambda expression)
2021.10.25 -
[Java] 컬렉션 프레임웍 (Collections Framework)
[Java] 컬렉션 프레임웍 (Collections Framework)
2021.10.19 -
[Java] 열거형 (enums)
[Java] 열거형 (enums)
2021.10.18 -
[Java] 지네릭스 (Generics)
[Java] 지네릭스 (Generics)
2021.10.17