본문 바로가기
JAVA

Scanner 클래스 사용법

by 윾수 2021. 9. 14.

java.util.Scanner

Scanner는 보조 입력 스트림으로 생성자를 사용할 때 파라미터로 메인이 되는 inputStream을 넣어 사용한다.

주료 키보드 입력을 받을 때 스캐너를 많이 사용하는데 System.in(InputStream)을 넣어 사용한다.

//Scanner = 보조 입력 스트림, System.in = 메인 입력 스트림
Scanner sc = new Scanner(System.in);

//next계열
String next = sc.next();
String nextInt = sc.nextInt();
String nextDouble = sc.nextDouble();
String nextBoolean = sc.nextBoolean();

//nextLine계열
String nextLine = sc.nextLine();

편의상 next계열, nextLine계열로 구분하여 작성한다.

1. next계열

  • next() : String
  • nextInt() : int
  • nextDouble() : double
  • nextBoolean() : boolean

특징 : 공백 혹은 개행 문자를 구분 단위로 사용하며 구분단위 이전까지의 값을 읽어 들여 처리한다.

 

2. nextLine계열

  • nextLine() : String

특징 : 공백도 포함하여 처리하며, 개행 문자만까지 읽어들여 처리한뒤 개행문자는 제외하고 반환한다.

 

3. 자주 일어나는 문제점

next계열은 공백 혹은 개행문자 전까지 읽어 들이고 nextLine계열은 개행 문자까지 읽어 들인다.

이러한 차이점 때문에 같이 혼용해서 사용하는 경우 오류가 발생할 수 있다.

아래의 코드를 같이 살펴보자

Scanner sc = new Scanner(System.in);

int i = sc.nextInt();
String s = sc.nextLine();


System.out.println("i = "+i);
System.out.println("s = "+s);

이러한 코드를 작성할 때에는 분명 숫자를 입력받아 변수 i에 저장하고, 문자열을 입력받아 변수 s에 저장하고
두 개의 변수를 사용해야지 라는 생각일 텐데 위의 코드는 생각대로 작동하지 않는다.

숫자만 입력받고 종료됨

왜??? 이런 현상이 발생할까

next계열과 nextLine계열의 차이점 때문이다.

nextInt()를 사용했을 때는 내가 버퍼에 7\n (\n = 개행 문자)를 입력했는데 nextInt()는 7까지만 입력을 받아온다. 

따라서 아직 버퍼에 \n 가 남아있는다. 이후에 nextLine()을 실행하면 내가 입력할 기회조차 주지 않고

버퍼에 남아있는 \n을 읽어 들여 s는 "" 빈 문자열을 입력받게 된다. 

 

해결법은??? 

흔히 말하는 개행 문자 날리기 작업을 해주면 된다.

nextLine()은 개행 문자까지 읽어 들여 처리하므로 nextLine()을 한번 더 입력해주면 된다.

Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
sc.nextLine();
String s = sc.nextLine();

System.out.println("i = "+i);
System.out.println("s = "+s);

두번째 줄까지 읽어들인 모습

물론 두 번째 줄에 공백을 포함한 한 줄을 가져오기 위해 nextLine()을 사용해야 해서 위처럼 개행 문자 날리기 작업을 해줬지만 변수 s에 만약 공백이 포함되지 않는 단어를 입력해야 한다면 개행문자 날리기 작업 대신 nextInt(), next()를 연달 아사용 해도 문제는 발생하지 않는다!

'JAVA' 카테고리의 다른 글

메모리 덤프(dump) 분석 [ jps, jmap, jhat ]  (0) 2022.05.16