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하는 타이밍이 다르다.
- System.in : 사용자 입력을 위한 스트림
- 표준 입출력 스트림에는 System.in / System.out / System.err 가 있다.
- 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 클래스는 입력받은 데이터를 자동으로 형 변환해서 리턴해주기 때문에 매우 편리한 입력 클래스다.
- 편한 대신 속도가 느리다는 단점이 있다.