[Java/자바] Scanner 클래스 (입력받기)

Scanner 클래스란?

Scanner란 사용자로 부터 입력을 받을 수 있도록 도와주는 것으로,

간단한 예시를 보자면, 사용자가 게임에 로그인하기 위해, 아이디와 비밀번호를 입력하는 것과 같습니다.

 

Scanner는 다음과 같은 특징을 가집니다.

  - 기본적인 데이터 타입을 모두 입력받을 수 있다.

  - 토큰을 기준으로 데이터를 입력받는다. (*토큰 : 공백 문자(Spacebar), 탭(Tab), 개행(Enter) 등으로 구분되는 요소*)

  - nextLine()은 띄어쓰기를 포함해 읽고, 나머지 메서드들은 띄어쓰기, 공백문자를 제외하고 읽는다.

 

Scanner 클래스 사용
import java.util.Scanner;
 
Scanner input = new Scanner(System.in);

 

  • System.in 이란?

사용자로부터 입력을 받기 위한 입력 스트림으로,

Scanner 뿐만 아니라 다른 입력 방식들도 사용자로부터 입력을 받기 위해서는 System.in이 사용됩니다.

 

Scanner 메서드
메서드 반환타입 설 명
next() String 다음 토큰을 String 타입으로 반환 ( 띄어쓰기 뒷 부분은 읽지 않는다.)
nextLine()  String 한 줄("\n (Enter)"를 치기 전까지)을 읽고, "\n (Enter)"값이 제외된 부분만을 출력한다.
(Ex: "My name is H"를 입력하고 엔터를 누르면 엔터를 누르기전까지인 "My name is H"가 출력")
nextByte() Byte 다음 토큰을 byte타입으로 반환
nextShort()  Short 다음 토큰을 short 타입으로 반환
nextInt()  Int 다음 토큰을 int 타입으로 반환
nextLong()  Long 다음 토큰을 long 타입으로 반환
nextFloat()  Float  다음 토큰을 float 타입으로 반환
nextDouble()  Double 다음 토큰을 double 타입으로 반환
close()  void Scanner의 사용 종료 
hasNext()  Boolean 현재 입력된 토큰이 있으면 true, 아니면 새로운 입력이 들어올 때까지 무한정 기다려서, 새로운 입력이 들어오면 그 때 true 반환.
ctrl + z 키가 입력되면 입력 끝이므로 false 반환
hasNextLine() Boolean 다음에 읽을 값(Line 줄)이 있는지 확인.

Scanner 예제

 

nextLine()과 나머지 메서드들의 차이

아래 예시 코드들을 보면 nextInt()는 123 34를 입력했지만, 입력값을 읽을 때 공백(Space)를 제외해서 읽어 123만을 출력합니다.

반면 nextLine()은 공백(Space)을 포함한 한 줄을 읽기 때문에 Hello Hi가 그대로 출력됩니다.

nextInt() 예시
import java.util.Scanner;

class ScannerEx1 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        System.out.print("숫자를 입력하세요 : ");
        int num = input.nextInt();
        System.out.println(num);
    }
}

 

nextLine() 예시
import java.util.Scanner;

class ScannerEx1 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        System.out.print(">> ");
        String str = input.nextLine();
        System.out.println(str);
    }
}

두 메서드를 같이 사용하여 비교

nextInt() 메서드는 공백을 제외해서 읽으므로 "3"만을 읽고 끝이나기 때문에  nextLine() " Hi"는 str에 저장됩니다.

import java.util.Scanner;

class ScannerEx1 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        System.out.println("다음과 같은 형식으로 입력해주세요. (3 Hello)");
        int num = input.nextInt();
        String str = input.nextLine();

        System.out.println("num : " + num);
        System.out.println("str : " + str);

        input.close();
    }
}

 

nextLine()을 이용하여 타입이 다른 값을 따로 입력 받기

nextLine()메서드를 중간에 추가하여 nextInt()값을 입력 받은 뒤 "\n (Enter)"값을 버리고 nextLine()값을 입력받습니다.

import java.util.Scanner;

class ScannerEx1 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        System.out.println("숫자를 입력해주세요.");
        int num = input.nextInt();
        input.nextLine();

        System.out.println("\n문자열을 입력해주세요.");
        String str = input.nextLine();

        System.out.println("num : " + num);
        System.out.println("str : " + str);

        input.close();
    }
}

 

hasNext()의 활용

hasNext()는 현재 입력된 토큰이 있으면 true, 아니면 새로운 입력이 들어올 때까지 무한정 기다려서, 새로운 입력이 들어오면 그 때 true 반환합니다.

hasNext()는 입력받은 값이 문자열일 때까지 true를 반환하고,

hasNext뒤에 Int, Byte 같은 타입을 붙여 해당 타입이 들어올 때까지 Scanner를 실행하도록 할 수 있습니다.

만약 hasNextInt로 정수의 입력이 들어 올 때까지 Scanner를 실행한다면 다음과 같이 코드를 짤 수 있습니다.

아래 코드를 보면 정수가 아닌 타입이 들어왔을 경우 hasNextInt()는 false를 종료하고 반복문을 종료합니다.

import java.util.Scanner;

class ScannerEx1 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        do {
            System.out.println("a값을 입력해주세요.");
            int a = input.nextInt();

            System.out.println("b값을 입력해주세요.");
            int b = input.nextInt();

            System.out.println("두 값의 합: " + (a + b));
        } while (input.hasNextInt());
    }
}