Scanner
안녕하세요!
이번 포스팅에서는 사용자로부터 입력을 받는 'Scanner'에 대해 알아보도록 하겠습니다.
Scanner는 C++의 'cin >>', 'scanf'와 동일한 기능을 수행합니다.
※ Scanner로 입력 받는 방법
① 키보드로부터 입력을 받는 스캐너 객체를 생성한다.
'Sca'까지만 입력하시고, ctrl + spacebar!
Scanner - java.util을 선택 후, 다음과 같이 입력합니다.
이와 동시 java.util.Scanner가 상단에 import됩니다.
또한, Scanner class의 객체인 'sc'가 생성되고, 입력 받을 준비를 마치게 됩니다.
저는 사용자의 주소와 이름을 받아, '누구씨는 어디에 산다'라고 결과를 출력해보도록 하겠습니다.
이를 위해 주소와 이름을 입력 받아, 각각 addr와 name이라는 변수에 넣겠습니다.
② Scanner로 입력 받을 때는, 'next자료형()' 메소드로 입력 받는다.
* nextInt(), nextLong(), nextDouble(), nextFloat() 등 입력 받을 자료형을 next 다음에 지정한다.
* String(문자열)은 반드시 next() 혹은 nextLine()으로 입력 받아야 한다.
* next() : 키보드 버퍼의 내용을 띄어쓰기 전까지 입력 받는다. 단어 단위로 입력 받는다.
* nextLine() : 키보드 버퍼가 비어있으면 입력을 요구하며 대기하고, 키보드 버퍼가 비어있지 않을 경우 키보드 버퍼에 저장된 문자열 전체를 입력 받는다. 줄 단위로 입력 받는다.
원칙대로라면 주소는 문자열이자 띄어쓰기가 포함되기 때문에 nextLine()로 입력을 받아야 하고,
이름은 띄어쓰기가 없기 때문에 next()로 입력을 받는 것이 맞습니다.
하지만 살펴봐야 집고 넘어가야 할 부분이 있어 주소는 next()로,
이름은 nextLine()으로 입력 받겠습니다.
마지막으로 입력과 출력이 끝나면, 객체 sc가 사용한 시스템 자원을 sc.close()로 반납하겠습니다.
* 시험용 소스 코드
* 제대로 된 소스 코드
실행하여 '서울시 광진구'를 입력하겠습니다.
참고로 Java는 한글에 대한 배려가 아직 없습니다. 실행하게 되면 커서가 주소 앞에 생기는데요.
번거롭지만 end키를 이용하여 ':' 다음으로 넘겨주시거나, 마우스로 입력 위치를 찍어주세요.
주소를 입력하고 enter키를 치면 당연히 이름을 물어보겠지?라고 생각했는데.
아니 결과가 왜...이럴까요?
next()가 단어 단위로 입력을 받으면 광진구는 버린다고 가정해도,
이름을 물어보는게 맞는 것 같은데...
그 이유는 키보드 버퍼 때문입니다.
키보드 버퍼란?
시스템 기억 장치 중 직전에 키보드로부터 입력된 문자를 기억해두는 작은 기억 영역.
출처 : 네이버 컴퓨터 인터넷 IT용어 대사전, 검색어 : 키보드 버퍼
next는 단어 단위로 입력을 받기 때문에, 서울시 이래 " 광진구"는 키보드 버퍼에 남아있게 됩니다.
그리고 결국 키보드 버퍼에 들어있던 값이 그대로 입력되어 버렸습니다.
nextLine()은 위에 설명한 것과 같이 키보드 버퍼에 메모리가 남아있으면,
있는 그대로 버퍼에 있는 값을 넘겨 받습니다.
그럼 키보드 버퍼를 지워주면 되겠죠?
키보드 버퍼를 지우는 방법은 간단합니다.
입력 받을 값들 사이에 '객체명.nextLine()'만 넣어주면 됩니다.
다음은 나이와 이름을 입력 받아, 현재는 몇 살이고, 내년에는 몇 살인지 출력하는 소스 코드입니다.
12번째 줄 'sc.nextLine()'가 키보드 버퍼를 삭제하는 코드입니다.
지금까지 Scanner로 입력을 받는 방법에 대해 포스팅하였습니다.
감사합니다 : )