Scanner 클래스 (부제: scanner.next(), scanner.nextLine() 차이점, scanner 문자만 입력)

2024. 1. 16. 10:19Java 기초개념

 

1. Scanner 클래스의 사용

  • 임포트: Java 프로그램에서 Scanner 클래스를 사용하기 위해서는 'java.util.Scanner'을 임포트해야 한다.
import java.util.Scanner;
  • Scanner 객체 생성: 입력 소스(표준 입력, 파일, 문자열 등)에 대한 'Scanner 객체'를 생성할 수 있다.
Scanner scanner = new Scanner(System.in)

 

2. 주요 메서드

Scanner은 다양한 유형의 데이터를 읽는 메서드들이 있다.

int number = scanner.nextInt() // 정수형을 읽는 scanner 메서드
float number1 = scanner.nextFloat() // 실수형을 읽는 scanner 메서드
double number2 = scanner.nextDouble() // 실수형을 읽는 scanner 메서드

 

그렇다면 숫자가 아닌, 문자열을 입력받고 싶을 때는 어떤 것을 사용할까?

String line = scanner.nextLine(); // 한 줄 전체를 문자열로 읽는다.
String word = scanner.next(); // 다음 토큰을 문자열로 읽는다. 공백은 토큰을 구분하는데 사용된다.

 

문자열을 입력받고 싶을 때 사용되는 메서드는 대표적으로 scanner.next()와 scanner.nextLine()이 있다.

이 두 가지의 메서드에는 큰 차이점이 있다.

1) scanner.next() 

scanner.next()는 한 단어를  입력받는다.

String word = scanner.next(); // 한 단어를 입력받는다.

 

scanner.next()는 공백, 탭, 개행 문자(엔터) 등을 구분자로 사용하여 첫 번째 토큰만 반환한다.

예를 들어, 위의 word에 "Hello World"를 입력했을 경우 공백을 구분자로 사용하기 때문에,

첫 번째 토큰인 Hello만을 저장한다. 

 

scanner.next()를 두 번 사용하면 어떤 결과가 나올까? 

String word = scanner.next();
String word2 = scanner.next();

 

첫 번째 word에는 구분자(공백) 이전의 Hello만 저장한다.

두 번째 word2에는 구분자(공백) 이후의 World를 저장한다. 

 

만약 "Hello World"가 아닌, "HelloWorld"를 입력하고 엔터키를 누르면 어떻게 될까?

첫 번째 word에는 HelloWorld가 저장되고,

두 번째 word2에는 아무것도 저장되지 않고, 새로운 입력을 기다리는 것에 머무르게 된다. 

 

2) scanner.nextLine() 

scanner.nextLine()는 한 줄 전체를 입력받는다.

String word = scanner.nextLine(); // 한 줄 전체를 입력받는다.

 

scanner.nextLine()은 개행 문자(엔터)까지 읽고, 그 전의 문자열을 반환한다.

예를 들어, "Hello World"를 친 다음 엔터를 치면, Hello Word 전체가 word에 저장된다. 

 

3) scanner.next()와 scanner.nextLine()을 함께 사용

그렇다면 scanner.next()scanner.nextLine()함께 사용하면 어떤 결과가 나올까? 

결론 먼저 얘기하자면, Scanner 클래스의 nextInt()와 같은 메서드들은 입력에서 해당 유형의 값을 읽고,  그 뒤의 개행 문자(엔터)를 소비하지 않아, nextLine에는 빈 문자열이 저장된다. 

 

nextInt() 후 nextLine()을 호출하지 않았을 경우

import java.util.Scanner;

public class ScannerDemo {
	public static void main(String[] args){
    	Scanner scanner = new Scanner(System.in);
        
        System.out.print("Scanner.nextInt에 대한 값: ");
        int number = scanner.nextInt();
        
        System.out.print("Scanner.nextLine에 대한 값: ");
        int line = scanner.nextLine();
        
        System.out.println("Number: " + number);
        System.out.println("Line: " + line);
        
        scanner.close();
    }
}

 

만약 사용자가 5를 친 다음 엔터키를 누르면, 

number에는 5가 들어가고, line에는 아무것도 들어가지 않는다. 

왜냐하면, number를 입력하고 개행 문자(엔터키)를 눌렀기 때문에 line에는 개행 문자(엔터키)를 읽고 빈 문자열을 반환해버리기 때문이다. 

원래는 값을 입력받고 엔터키를 눌렀을 때 line이 "값+개행 문자"를 인식하고 반환해야 하는데, 

number에서 5를 입력하고 엔터키를 누르면, number에는 5만 들어가고, 개행 문자(엔터키)만 남기 때문에,

컴퓨터는 이 개행 문자(엔터키)만을 인식하고 입력이 종료되었다 인식해 문자열을 반환한다. 

 

그렇다면 number 이후의 line도 입력하고 싶다면 어떻게 해야할까?

nextInt() 후 추가적인 nextLine()을 호출하면 된다. 

nextInt() 후 추가적인 nextLine()을 호출했을 경우

import java.util.Scanner;

public class ScannerDemo {
	public static ovid main(String[] args){
    	Scanner scanner = new Scanner(System.in);
        
        System.out.print("scanner.nextInt()에 대한 값: ");
        int number = scanner.nextInt();
        scanner.nextLine(); // 개행 문자 소비
        
        System.out.print("scanner.nextLine()에 대한 값: ");
        String line = scanner.nextLine(); // 실제 문자열 입력 받음
        
        System.out.println("Number: " + number);
        System.out.println("Line: " + line);
        
        scanner.close();
     }
}

 

만약 "5"를 입력하고, nextInt() 이후 개행 문자를 소비할 nextLine()을 호출하면, 

number에는 "5"가 저장되고,

scanner.nextLine() 호출을 통해 개행 문자를 소비하고, 

line에서는 새로운 문자열을 입력받게 된다. 

 

+) 만약 "문자열"이 아닌 "문자"를 입력받고 싶다면?

아쉽게도 scanner 클래스에는 문자만을 입력받을 메서드가 없다.

따라서 scanner.next()를 통해 문자열을 입력받고, 

String 클래스의 chartAt(int index)를 통해, 한 가지 문자만 추출하면 된다. 

 

import java.util.Scanner;

public class ScannerExample {
	public static void main(String[] args){
    	Scanner scanner = new Scanner(System.in);
        
        // 첫 번째 방법
        int word = scanner.next();
        int word_char = word.charAt(0);
        
        // 두 번째 방법
        int word2 = scanner.next().charAt(0);
        
    }
}

 

첫 번째 방법은 문자열을 입력받은 후 문자를 추출하는 것이고,

두 번째 방법은 처음부터 문자열에서 문자를 추출해 저장하는 것이다. 

 

참고자료

1. [java] Scanner를 이용하여 char 입력하기, 낭람

 

 

[java] Scanner를 이용하여 char 입력하기

[자바 char형 입력] 자바 Scanner는 문자를 입력받는 기능이 없다.즉, Scanner.next()로 문자열을 입력받은 다음, String.charAt(0)으로 첫번째 문자를 꺼내오면 된다. (1)String s = scanner.next(); char c = s.charAt(0);(2

security-nanglam.tistory.com

 

2. 자바 [JAVA] - 스캐너(Scanner) 클래스와 입력, Stranger's LAB

 

자바 [JAVA] - 스캐너(Scanner) 클래스와 입력

자바를 처음 배울 때 아마 대부분은 키보드로 입력받기 위해 Scanner 라는 클래스를 썼을 것이다. 자바 외에도 다양한 언어들은 각각의 입력방식이 있고, 각 언어별로 대표하는 대중적인 입력방식

st-lab.tistory.com