사용자 입력을 받기 위한 다양한 방법이 있지만 그 중 제일 많이 사용하는 Scanner() 클래스에 대해서 알아보자.
Scanner
자바를 처음 배울 때 콘솔에서 키보드 입력값을 받을 때 가장 많이 사용하는 클래스가 Scanner 클래스이다.
기본적인 데이터 타입들을 Scanner 의 메소드를 사용하여 입력받을 수 있다. System.in을 통해 사용자 입력을 받으면 여러 과정을 거쳐야해서 복잡하고 어려운데 자바에서 Scanner라는 클래스를 제공한다. 이를 사용하면 사용자 입력을 매우 편리하게 받을 수 있다.
1. Scanner class import
java.util이라는 자바가 제공하는 라이브러리의 Scanner를 사용하기 위해 java.util 패키지를 import 해주어야 한다.
아래와 같이 java.util에 있는 모든 클래스를 import 해도 되고, java.util의 Scanner 클래스만 import 해주어도 된다.
import java.util.*; // java.util에 있는 모든 클래스 import
import java.util.Scanner; // java.util의 Scanner 클래스만 import
2. Scanner 변수 선언
Scanner 변수를 선언한다. Scanner를 만들고 결과를 담아둔다는 의미. 자바에서 System.out을 통해서 출력하듯이 입력은 System.in을 통해서 입력을 받는다.)
Scanner sc = new Scanner(System.in); // sc라는 이름으로 Scanner 객체 생성
3. 사용자가 입력한 데이터 가져오기
사용자가 입력한 문자열을 읽어서 str에 담는다.
String str = sc.nextLine(); //입력한 String을 가져온다.
문자열 입력을 위해 String으로 선언을 하였는데 Scanner 클래스에는 다양한 메서드 들이 존재한다.
Scanner 클래스의 메서드
Scanner 입력 메서드들은 대부분 공백과 개행(' ', '\t', '\r', '\n' 등등..)을 토큰을 기준으로 읽는다. 이 덕분에 사용자의 편의에 따라 쉽게 입력을 받을 수 있다.
** 토큰(Token) : 공백문자(Spacebar, Tab, Enter 등)로 구분되는 요소
ex) Scanner 사용 예제
package Scanner;
import java.util.Scanner;
public class Scanner1 {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.print("문자열을 입력하세요:");
String str = sc.nextLine(); //입력을 String으로 가져온다.
System.out.println("입력한 문자열: " + str);
System.out.print("정수를 입력하세요:");
int intValue = sc.nextInt();
System.out.println("입력한 정수: " + intValue);
System.out.print("실수를 입력하세요:");
double doubleValue = sc.nextDouble();
System.out.println("입력한 실수: " + doubleValue);
}
}
위 코드를 실행하게 되면 콘솔창에 사용자의 입력을 기다린다.
이에 문자열로 "Hello World"를 입력하니 아래와 같은 결과가 나왔다.
** 주의!! 만약 실수로 선언해둔 타입에 다른 타입을 입력하게 되면 다르면 다음과 같은 오류가 발생한다.
** next() vs nexeLine() 차이
Scanner 메소드 중 next() 와 nextLine() 가 헷갈릴 수 있는데 해당 부분은 아래 예제로 이해 가능하다.
사용자가 "Hello World"라는 문자열을 next()와 nextLine() 메소드를 사용해 입력한다 가정하면,
아래와 같이 출력된다.
next() 메소드는 토큰 기준으로 데이터를 읽으며 엔터(\n)의 뒷부분은 가지고 오지 않아 Hello만 출력된다. ( 개행 문자를 무시하고 입력을 받음 )
nextLine() 메소드는 엔터(\n)를 포함하는 한 라인을 읽고 엔터(\n)를 버린 나머지 데이터인 _World 출력하게 된다. ( 한줄 단위로 입력을 받기 때문에 개행 문자로 포함 ) 여기서 왜 nextLine() 메소드는 한 라인으로 읽을까?
해당 메소드는 입력값과 개행문자(\n, tab등) 도 모두 버퍼에 저장하기 때문이다. 공백문자를 다른 곳에서 읽어들이기 전까지는 버퍼에 저장하고 있다. 그래서 앞선 Hello_까지 저장하고 있어 _World를 출력하게 된다.
** "김영한의 자바 입문강의 - 코드로 시작하는 JAVA 첫걸음" 강의 을 참고하여 작성하였습니다.