JAVA를 사용할 때 Scanner는 정말 많이 쓰이는 라이브러리입니다.
그런데 Scanner는 어떻게 이용할 수 있을까요?
먼저 알아야 할 것은 System.in 과 System.out 입니다!
- System.in
키보드나 마우스와 같은 입력 장치를 통해 들어오는 표준 입력 값
Ex) Scanner scan = new Scanner(System.in);
키보드로 입력되는 값을 받아들이는 스캐너 객체 생성 - System.out
모니터와 같이 출력 장치에서 내보내는 값
Ex) System.out.print(“이 문자는 모니터에 출력됩니다.”);
위와 같이 스캐너 객체를 생성할 때 표준 입력 값을 받도록 합니다.
그렇다면 그 다음은? — 스캐너에 받은 입력값을 이용해야겠죠!
예를들면,
“사용자에게 정수를 하나 입력받은 후,
곱하기 2를 하여 출력해주세요!”
라는 요구를 받는다면 스캐너를 이용해서 변수에 정수를 받은 후 2를 곱해서 출력하면 됩니다.
우리가 사용하는 언어는 JAVA이기 때문에 변수의 자료형을 선언하고, 그에 맞는 자료타입을 받아야하기 때문에, 스캐너로 입력을 받을 때 자료형을 구분해주어야 합니다.
- int n = scan.nextInt();
- String str = scan.nextLine();
- char c = scan.nextLine().charAt(0);
- double d = scan.nextDouble();
하지만 아래 코드와 같이 사용할 때 가끔 문제가 생기곤 합니다.
스캐너로 정수와 문자열 두 번을 입력받아야하는데, 왜 한번 입력받은 후 출력으로 넘어가버렸을까요?
nextInt() 를 주목해봅시다!
이것이 의미하는 바는 “입력 장치를 통해 큐(파이프) 형태로 들어온 값들 중에서 다음의 정수를 가져오겠다.” 라고 생각해봅시다.
nextInt() 는 입력값으로 들어온 값 중에 Enter나 공백을 기준, 그 앞의 Int형 값을 가져옵니다! 위 코드의 경우 정수를 가져왔으며, 큐에 남아있는 값은 Enter입니다.
nextLine() 은 큐에 남은 것들을 문자열로 가져와버립니다.
그래서 Enter 값을 공백 문자열로 가져와버리고 끝나기 때문에 출력 단계로 넘어간 것입니다.
이럴 때 다음 입력값을 원활하게 받기 위해 해야하는 것이 있습니다.
버퍼 비우기
자료형 [변수명] = 스캐너.next자료형();
형태가 아닌
스캐너.nextLine();
으로 큐에 남은 값들을 스캐너를 이용하여 비워주는 것입니다!
(!) nextInt() 로 입력을 받는 상황에서 공백이나 Enter 입력 없이 숫자와 문자를 한번에 입력해버리는 것은 예외를 발생시킵니다.