초심자의 친구 Scanner
사용자 입력값을 받는 과정을 가장 간단한 방법인 Scanner를 이용해서 처리하다보면 의도치 않게 동작하는 경우가 발생한다. 대표적인 예시가 정수입력을 받은 뒤 String 입력을 받으려할 때 발생하는데 구체적인 예시를 통해서 이해해보자!
Scanner의 배신
상황을 가정해보자. 학생의 나이와 이름을 순서대로 입력받은 뒤 이를 저장하는 프로그램을 만드는 중이다. 이를 위해 코드를 아래와 같이 작성하였다.
Scanner sc = new Scanner(System.in);
System.out.println("점수와 이름을 입력해주세요.");
int score = sc.nextInt();
String subject = sc.nextLine();
System.out.println("점수 : " + score + " 점");
System.out.println("과목 : " + subject +" 입니다");
위의 사진은 예제 코드를 실행했을 때, 콘솔창이 어떻게 동작했는지 캡쳐한 것이다.
뭔가 이상하다...
분명 입력을 nextInt() 와 nextLine()으로 2번 받으려 했는데, 입력은 1번만 할 수 있었고, 과목명은 아예 아무런 값도 없다... 원인은 Scanner의 nextInt() 와 nextLine()의 동작 원리에 있다.
nextInt() 와 nextLine()의 동작원리
1. nextInt()
nextInt는 입력 장치를 통해 들어온 값들 중 개행문자 전까지의 정수를 가져오는 함수이다.
예를 들어, 숫자 3을 입력하면 어떤 값들이 들어오는 것일까?
실질적인 입력값 ->3 과 '\n'
즉 숫자 3과 엔터를 치면서 '개행 문자'가 같이 들어온 것이다.
그렇다면 nextInt() 가 끝나고 나면 Scanner의 버퍼(입력을 받아들이는 파이프) 안에는 개행문자 만 남아있는 것이다.
2. nextLine()
nextLine()은 개행문자 전까지 남아있는 문자들을 문자열로 가져와 버린다.
문제의 원인이 밝혀졌다!!
문제의 원인은 nextInt() 메소드 종료후에 개행문자가 버퍼안에 남아있어서, 다음의 nextLine()메소드가 그냥 종료되어 버린것이다.
그렇다면 이를 어떻게 해결해야 원하는 데로 두번의 입력을 넣을 수 있을까? 해결법은 간단하다!
간단한 해법 : nextLine() 중간 삽입!
위의 예제 코드를 다음과 같이 수정하면 된다!
Scanner sc = new Scanner(System.in);
System.out.println("점수와 이름을 입력해주세요.");
int score = sc.nextInt();
//######################################
sc.nextLine(); // 버퍼안의 개행문자 없애는 과정
//######################################
String subject = sc.nextLine();
System.out.println("점수 : " + score + " 점");
System.out.println("과목 : " + subject +" 입니다");
즉, nextInt() 후에, nextLine() 메소드를 호출하여 개행문자를 소멸시키면 된다!
'Java' 카테고리의 다른 글
향상된 for문 활용하기 (0) | 2024.01.19 |
---|---|
Thread에 대한 기초 개념 정리 (2) | 2024.01.17 |
Return 값을 굳이 부여하는 이유 (2) | 2024.01.16 |
Collection Framework - ArrayList 정리 (2) | 2024.01.08 |
연산자 정리 (2) | 2024.01.05 |