
Scanner 클래스는 Java에서 표준 입력(콘솔 입력)이나 파일, 문자열 등의
다양한 입력 소스로부터 데이터를 읽어오는 데 사용되는 유틸리티 클래스다.
Scanner는 Java의 java.util 패키지에 포함되어 있으며,
사용자가 입력한 데이터를 파싱하는 다양한 메소드를 제공하고
입력된 데이터를 적절한 타입으로 자동으로 변환하여 반환한다.
Scanner(InputStream source)Scanner sc = new Scanner(System.int);
Scanner(File source)File file = new File("input.txt");
Scanner sc = new Scanner(file);
Scanner(String source)String data = "Hello World!";
Scanner sc = new Scanner(data);
| 메서드 | 동작 | 반환 타입 | 
|---|---|---|
| next() | 공백을 기준으로 다음 토큰(단어)를 읽음 | String | 
| nextLine() | 줄바꿈 문자를 기준으로 입력을 읽음 | String | 
| nextInt() | 다음 입력을 정수(int)로 읽음 | int | 
| nextDouble() | 다음 입력을 실수(double)로 읽음 | double | 
| nextBoolean() | 다음 입력을 논리값(boolean)으로 읽음 | boolean | 
| hasNext() | 다음에 읽을 수 있는 토큰이 있는지 확인 | boolean | 
| hasNextLine() | 다음 줄이 있는지 확인 | boolean | 
| useDelimiter(String pattern) | 입력을 구분하는데 사용할 패턴 설정(기본은 공백, 줄바꿈) | Scanner(자기 자신) | 
| close() | 객체를 닫아 자원을 해제 | 
public class Main{
    public static void main(String[] args){
        // 1. 문자열을 입력 소스로 하는 Scanner 객체 생성
        String input = "Java 101\nIntelliJ\n3.14 true\nHello,World! Bye, World!, 42";
        Scanner sc = new Scanner(input);
        // 2. next() - 공백 전까지의 문자열 읽기
        System.out.println("First Word: " + sc.next());
        // 3. nextInt() - 정수 읽기
        System.out.println("Integer: " + sc.nextInt());
        // 4. nextLine() - 한 줄 전체 읽기
        sc.nextLine();      // 한 줄 이동
        System.out.println("Line: " + sc.nextLine());
        // 5. nextDouble() - 실수 읽기
        System.out.println("Double: " + sc.nextDouble());
        // 6. nextBoolean() - boolean값 읽기
        System.out.println("Booelan: " + sc.nextBoolean());
        // 7. hasNext() - 다음 토큰이 있는지 확인
        if(sc.hasNext()){
            System.out.println("Next Tocken: " + sc.next());
        }
        // 8. useDelimiter - 구분자 변경(공백 → 콤마)
        sc.useDelimiter(",");
        System.out.println("First Word: " + sc.next().trim());
        System.out.println("Second Word: " + sc.next().trim());
        sc.useDelimiter("\\s*,\\s*"); // 콤마와 주변 공백을 모두 구분자로 설정
        // 9. hasNextLine() - 다음 줄이 있는지 확인
        if(sc.hasNextLine()){
            System.out.println("Last Integer: " + sc.nextInt());
        }
        // 10. close - Scanner 객체 닫기
        sc.close();
    }
}
Scanner의 메소드는 입력을 처리한 후, 다음 토큰을 읽기 위해 커서를 이동 시킨다.
nextInt()에서 정수를 입력하고 nextLine()에서 문자열을 입력한 뒤
각각의 입력값인 inputInt와 inputString을 출력하려고 하면,
예상 동작과 다르게 문자열을 입력하지 못하고, 문자열의 입력값도 공백으로 출력된다.
원인은 두 메서드 간의 동작 차이 때문에 문제가 발생한다.
nextInt()
nextInt()는 사용자가 정수를 입력하고 개행 문자(Enter)를 치면
입력 버퍼에 해당 정수 뒤에 오는 개행 문자를 남긴다.
nextLine()
nextLine()은 입력 버퍼에서 개행 문자를 만나면 줄을 끝냈다고 판단하고
그 다음 줄을 읽기 시작한다. - 개행 문자 단위로 읽는다
 하지만 nextInt()로 인해 개행 문자가 버퍼에 남아 있으면
nextLine()은 이 남아있는 개행 문자로 인해 빈 문자열을 읽게 된다.
이로 인해, nextLine() 메서드가 새로운 문자열 입력을 기다리지 않고,
버퍼에 남아 있는 개행 문자를 읽어 빈 문자열을 반환하게 된다.
정수를 입력받은 후 nextLine()을 호출해 추가적으로 한 줄을 읽어 개행 문자를 소비한다.
