Java

Scanner 클래스

h2boom 2024. 7. 10. 20:36

java.util.Scanner

  • Scanner 클래스는 사용자로부터 입력을 받기 위해서 사용되는 클래스다.

 

// 1번 방식
import java.util.*;

// 2번 방식
import java.util.Scanner;
  • Scanner 클래스를 사용하기 위해서는 import가 필요하다.
    • java.lang 패키지의 클래스가 아니라면 타 패키지의 클래스를 사용하기 위해서 모두 import가 필수적이다.

 

Scanner scanner = new Scanner(System.in);
  • Scanner 클래스를 사용하기 위해서 객체 생성은 당연히 필요하다.
  • 생성자의 매개 변수로 들어간 System.in 은 무엇일까?
    • 자바에서 표준 입출력을 위해 제공하는 세 가지 입출력 스트림 중 하나로 사용자로부터 입력을 받기 위한 입력 스트림이다.
      • 표준 입출력 스트림에는 System.in / System.out / System.err 가 있다.
        • System.in : 사용자 입력을 위한 스트림
          • 콘솔로부터 데이터를 입력 받는데 사용되는 스트림이다.
        • System.out : 출력을 위한 스트림
          • 자체적으로 버퍼를 지니고 있으며 JVM 성능 저하를 고려하여 버퍼에 여러 request를 담아두고 있다가 적절한 타이밍에 출력(flush)한다.
        • System.err : 에러 메시지 출력을 위한 스트림
          • 마찬가지로 자체적으로 버퍼를 지니고 있지만 에러는 일반적이지 않은 상황을 의미하므로 곧바로 출력(flush)을 한다. System.out과 flush하는 타이밍이 다르다.
    • Scanner를 제외한 다른 입력 방식에서도 System.in을 매개 변수로 받는다.

 

  • Scanner 클래스의 메소드
    • nextBoolean() : boolean 타입을 입력받아서 리턴한다.
    • nextByte() : byte 타입을 입력받아서 리턴한다.
    • nextShort() : short 타입을 입력받아서 리턴한다.
    • nextInt() : int 타입을 입력받아서 리턴한다.
    • nextLong() : long 타입을 입력받아서 리턴한다.
    • nextFloat() : float 타입을 입력받아서 리턴한다.
    • nextDouble() : double 타입을 입력받아서 리턴한다.
    • next() : 공백을 기준으로 한 단어를 입력받아서 리턴한다.
    • nextLine() : 개행(줄바꿈)을 기준으로 한 줄을 입력받아서 리턴한다.

 

  • Scanner 클래스 주의사항
    • Scanner 클래스에는 char 타입을 입력받는 메소드가 따로 존재하지 않는다.
    • 입력받을 타입 외 다른 타입을 입력 시 예외가 발생한다.
    • next()와 nextLine()은 개행(줄바꿈)을 받아들이는 방식이 다르다.
      • next()는 개행 문자를 무시하고 입력받는다.
      • nextLine()은 개행 문자를 포함하여 입력을 받는다.
      • ex) hello 입력 후 개행을 했을 경우
        next()는 버퍼에서 hello만 가져와 리턴하고 버퍼에는 개행문자(\n)가 남아있다.
        nextLine()은 버퍼에서 hello\n 모두 가져와 리턴하기에 버퍼에는 아무것도 남아있지 않다.

 

// Scanner 클래스에서 char 타입 입력
Scanner sc = new Scanner(System.in);
sc.next().charAt(0);
  • Scanner 클래스에서 char 타입을 입력받는 메소드가 따로 존재하지 않는다.
    • next()로 단어를 입력받거나 nextLine()로 문자열 한 줄을 입력받은 후 String 클래스의 charAt() 메소드로 한 개의 문자만 입력받을 수 있다.

 

Scanner sc = new Scanner(System.in);

String str1 = sc.next();
String str2 = sc.nextLine();

System.out.println(str1);
System.out.println(str2);

/* 사용자 입력 값
hello\n
bye\n 
*/

/* 출력 값
hello

*/
  • 여러 문자열을 입력받을 때 위와 같이 사용하는 경우 next()는 개행문자를 무시하고 nextLine()은 개행문자를 포함하기 때문에 원하는 값이 나오지 않을 수 있다.
    • 처음 hello 입력 후 엔터를 했기에 버퍼에는 hello\n가 담겨져 있는 상황
    • next()는 개행문자를 무시하고 가져오므로 버퍼에서 hello만 가져와 리턴해주고 \n는 버퍼에 남아있는 상태
    • nextLine()이 수행되자 입력받기도 전에 버퍼에 남아있던 \n를 가져와 한 줄의 입력으로 받아들여 입력을 종료 후 리턴한다.
    • 그래서 str1에는 hello 문자열이 저장되어 있고 str2에는 개행문자(\n)가 저장되어 있기에 출력 시 위와 같이 나오게 되는 것이다.
    • 버퍼에 남은 개행문자로 인한 실수를 피하기 위한 방법
      • nextLine()을 먼저 사용 후 next()를 사용
      • next()를 연속으로 사용
      • nextLine()을 연속으로 사용
  • 여러 문자열을 입력받을 때 상황에 알맞은 메소드를 사용해서 입력을 받아야한다.

 

  • Scanner 클래스는 입력받은 데이터를 자동으로 형 변환해서 리턴해주기 때문에 매우 편리한 입력 클래스다.
    • 편한 대신 속도가 느리다는 단점이 있다.