본문 바로가기
Back-end/Java_T.I.L

[TIL 22.01.27] Scanner클래스 사용법

by 사장님나빠여 2022. 1. 27.

#Scanner 클래스

Scanner 클래스 특징

1. 기본적인 데이터 타입들을 Scanner의 메소드를 사용하여 입력받을 수 있다.

2. Scanner을 사용할 시 util 패키지를 경로의 Scanner 클래스를 호출해야 한다.

3. 공백(띄어쓰기)또는 개행(줄 바꿈)을 기준으로 읽는다

  Scanner의 입력 메소드들은 대부분 공백과 개행(' ', '\t'(tab), '\r', '\n(enter)' 등등)을 기준으로 읽는다. 이 덕분에 사용자의 편의에 따라 쉽게 입력받을 수 있다.

Scanner 클래스 사용

java.util 패키지의 Scanner 클래스를 이용하면 콘솔로부터 기본 타입의 값을 바로 읽을 수 있다. Scanner 객체를 생성하려면 다음과 같이 생성자에 System.in 매개값을 주면 된다. 

Scanner 클래스에서 3개의 메소드를 사용해보았는데 각각 메소드에 맞게 알맞는 데이터 타입의 값으로 리턴해준다. 이 중 문자열을 입력받아 리턴하는 nextLine()메소드가 많이 쓰인다. 이 메소드는 String타입으로 리턴해주는데 이것과 같은 타입의 메소드로 nxet()가 있다.

#next()와 nextLine()메소드의 차이

위 코드를 보면 next()메소드는 '안녕하세요'만 반환한것을 알 수 있다. nextLine()과 next()메소드의 차이는 nextLine()메소드는 공백 문자와 상관 없이 콘솔 창 한 줄(Line)에 있으면 모두 문자열로 인식해서 Enter를 치기 전까지 쓴 문자열을 모두 리턴한다는 것이고 next() 메소드는  토큰의 개념으로 문자열을 입력받는데,  스페이스 즉 공백 전까지 입력받은 문자열을 리턴한다는 것이다. 그래서 공백이 있는 문자열 한줄을 리턴받고 싶으면 nextLine() 메소드를 사용하고 그냥 한 단어만 쓰고 싶다면 next()를 쓰는 것이지만 nextLine()을 써도 상관 없다. 

 

nextInt()메소드 다음에 nextLine()메소드를 실행하려고 할 때 nextLine()메소드가 그냥 넘어가버리는 오류가 생겨난다. 이 이유는 nextInt()메소드를 실행할 때 20을 콘솔에 입력하고 엔터를 누를 때 20을 리턴시켰지만 개행문자(Enter값)는 그대로 남아있다. nextLine()메소드는 Enter값을 기준으로 메소드를 종료시키기 때문에 nextLine()메소드가 실행될 때 남아있는 Enter값을 그대로 읽어 바로 종료된 것이다.

 

그래서 '첫번째 문자열 입력 : '이 넘어가고 '두번째 정수 입력 : '이 출력된 것이다. 만약 정수를 입력하고 그 다음 문자를 입력하려고 할 때 next()메소드를 사용하여야 한다. 아니면 위에 nextLine메소드를 한번 더 써줘서 enter값을 없애줘야 한다. 다른 방법으로는 정수를 nextLine()으로 입력받고 Integer.parseInt()로 변환해서 사용하는 것이다..

 

#Scanner의 메소드

메소드 설명
String next() 다음 토큰을 문자열로 리턴
byte nextByte() 다음 토큰을 byte 타입으로 리턴
short nextShort() 다음 토큰을 short 타입으로 리턴
int nextInt() 다음 토큰을 int 타입으로 리턴
long nextLong() 다음 토큰을 long 타입으로 리턴
float nextFloat() 다음 토큰을 float타입으로 리턴
double nextDouble() 다음 토큰을 double타입으로 리턴
String nextLine() '\n(enter)'을 포함하는 한 라인을 읽고
'\n(enter)'을 버린 나머지만 리턴
void close() Scanner의 사용 종료
boolean hasNext() 현재 입력된 토큰이 있으면 true, 아니면 새로운 입력이 들어올 때까지 무한정 기다려서, 새로운 입력이 들어오면 그 때 true리턴, ctrl+z키가 입력되면 끝이므로 false 리턴

 

댓글