본문 바로가기
Java

User Input 받는 방법 - Scanner사용

by GGShin 2022. 4. 22.

Scanner는 코딩테스트를 하려다 보니 알게된 class 인데, String이나 integer등 input을 받을 수 있도록 도와주는 역할을 한다.

Scanner 변수를 만들어 주면 콘솔창에 보이지 않는 투명의 입력 칸이 생기게 됩니다.

먼저 Scanner를 사용하려면 아래와 같이 Scanner를 선언해 주어야 한다.

1
2
3
Scanner sc = new Scanner(System.in);
 
sc.close();
cs

Scanner를 사용 완료하고 더 이상 사용하지 않게 될 때에는 close 해주어야 하므로, Scanner를 선언할 때 close()까지 같이 적어주는 것이 좋다. 이렇게 Scanner를 선언하면, 자동으로 Scanner가 import됩니다. 

보면 콘솔창에 output을 찍어낼 때 사용하는 System.out.println()과는 반대로 System.in이 들어가니 input을 위한 도구이구나 하고 생각하면 될 것 같다.

 

그러면 이 Scanner는 어떻게 사용하고 어떤 일을 할 수 있을까?

1. String 타입의 input 받기

한 번 String 타입을 입력할 수 있는 scanner를 만들어 보았다. 

1
2
3
4
5
Scanner sc = new Scanner(System.in);
 
sc.nextLine();
 
sc.close();
cs

String type을 입력받는 scanner는 .nextLine()으로 만들 수 있습니다.

이렇게만 입력하고 실행시킨 뒤 콘솔창을 보면 아무것도 나오지 않습니다. 하지만 먼저 얘기한 것처럼 투명의 입력창이 생겨있습니다. 콘솔창을 누르고 문자(열)를 입력하면 입력이 가능하게 됩니다. 그리고 입력하면 초록색으로 입력한 내용이 보입니다.

 그러면 이제 입력된 값을 가지고 여러 가지를 해볼 수 있게 됩니다.

예를 들어서, 유저가 아이디를 입력하면 "아이디는 (입력한 string value) 입니다." 와 같은 문장이 출력되도록 할 수도 있겠죠?

1
2
3
4
5
6
7
8
Scanner sc = new Scanner(System.in);
 
System.out.println("아이디를 입력해주세요:");
 
String userId = sc.nextLine(); //nextLine()에 입력된 값을 뒤에서 활용하기 위해서는 이렇게 변수에 저장하면 됩니다.
System.out.println("아이디는 '" + userId + "' 입니다.");
 
sc.close();
cs

Jeju-er 라는 string을 입력하였더니, 제대로 output이 나온 것을 확인할 수 있습니다.

2. Integer 타입의 input 받기

Integer 타입의 input을 받으려면 .nextInt()를 사용하면 됩니다.

1
2
3
4
5
6
Scanner sc = new Scanner(System.in);
 
int number = sc.nextInt();
System.out.println("입력한 숫자는 " + number + " 입니다.");
 
sc.close();
cs

숫자 9를 입력하였더니, 제대로 output이 나온 것을 확인할 수 있습니다.

 

그렇다면, nextInt()를 사용하였는데 integer가 아닌 값을 입력 받게 되면 어떻게 될까요?

이렇게 crash 됩니다. 이러한 사태를 미연에 방지해야 하기 때문에, 입력된 값이 유효한 값인지 확인하는 장치를 달아 줄 필요가 있습니다.

 

3. hasNextInt()

Scanner에서 integer를 받기로 했는데 제대로 integer가 들어왔는지, 다른 타입의 값이 들어온 것은 아닌지 확인하기 위해서는 hasNextInt() method를 사용하면 됩니다.  

1
2
3
4
5
6
7
8
9
10
11
Scanner sc = new Scanner(System.in);
 
boolean hasNextInt = sc.hasNextInt();
if(hasNextInt == true) {
    int number = sc.nextInt();
    System.out.println("입력한 숫자는 " + number + " 입니다.");
else {
    System.out.println("숫자를 입력해주세요.");
}
 
sc.close();
cs

예외 처리를 해주었더니 java가 경고를 보내오지는 않았습니다.

그런데 잘못된 입력이 들어왔다고 해서 멘트만 보여주고 바로 프로그램이 종료되면 사용자 경험이 좋지 못해 보입니다.

제대로 integer type의 input이 들어올 때까지 재입력 할 수 있게 한다면 더 좋겠죠?

 

저는 한 번 while문을 사용해서 코드를 작성해 보았습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Scanner sc = new Scanner(System.in);
 
while(true) {
     boolean hasNextInt = sc.hasNextInt();
     if(hasNextInt == true) {
        int number = sc.nextInt();
        System.out.println("입력한 숫자는 " + number + " 입니다.");
        break;
     } else {
        System.out.println("숫자를 입력해주세요.");
     }
     sc.nextLine();
}
 
sc.close();
cs

이렇게 처리를 해주니 integer input이 들어올 때까지 반복적으로 scanner가 생성되게 되었습니다.

Crash 없이 안정적으로 처리가 되는 모습을 보니 꽤 마음에 들었습니다. ☺️

 

그런데 위 코드에서 보면, while문 끝자락에 sc.nextLine();이 들어가 있는 것을 보실 수 있습니다.

String 입력을 받을 것도 아니면서 왜 넣은 걸까요?  

바로 nextInt()의 특징 때문입니다. nextInt() 다음에  nextLine()을 사용하면, nextLine()이 skip 됩니다.

한 번 예를 통해 확인해보겠습니다. 아래 코드를 한번 보면,

1
2
3
4
5
6
7
8
9
10
Scanner sc = new Scanner(System.in);
 
System.out.println("First integer:");
sc.nextInt();
System.out.println("First String:");
sc.nextLine();
System.out.println("Second integer:");
sc.nextInt();
 
sc.close();
cs

First integer:

//integer 입력해주고

First String:

//String 입력해주고

Second integer:

//integer 입력해주고

이렇게 될 것 같습니다. 하지만 저 상태로 코드를 실행해보면 

이렇게 String 입력 스캐너가 skip된다는 것을 확인할 수 있습니다. 정확히 말하면 skip이라기 보다는 nextInt()에 입력값을 넣고 엔터키를 누르면 생기는 line separator(개행문자)를 그 다음에 있는 nextLine()의 입력값으로 넘겨버리는 것입니다. 

그러다보니 뒤에 입력할 String을 입력하지 못하게 되는 것이죠.

이런 일을 없애기 위해 개행문자를 받아 줄 .nextLine()을 중간에 한 번 작성하여 주는 것입니다.

미연에 문제를 방지하기 위해서 nextInt()를 사용하는 경우에는 String을 입력받을 일이 없더라도 nextLine()을 꼭 써주는 것 같습니다.

 

여기까지 Scanner 기본 사용법을 알아보았습니다.

잘 알고 있어야 할 사항은,

1. Scanner 선언 시에 .close() 도 잊지 않고 같이 작성해줘야 한다.

2. 예외처리를 위한 hasNextInt() (hasNextDouble, hasNextLine 등 다른 String 및  primitive type 확인을 위한 method도 있습니다.)를 적절하게 사용해야 한다.

3. nextInt() 사용 시에는 nextLine()을 꼭 써줘서 개행문자 입력에 대비해줘야 한다.

였습니다. ☺️

 

*Scanner로 사용이 가능한 함수들은 Oracle 페이지에 잘 정리 되어 있습니다.

https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

 

Scanner (Java Platform SE 7 )

Scans the next token of the input as a float. This method will throw InputMismatchException if the next token cannot be translated into a valid float value as described below. If the translation is successful, the scanner advances past the input that match

docs.oracle.com

 

 

반응형

'Java' 카테고리의 다른 글

Class(3)-Inheritance(상속) 사용하기  (0) 2022.04.25
Class(2)-Constructor-set을 간편하게  (4) 2022.04.25
Class(1)-Class란 & Class 사용하기  (0) 2022.04.25
Switch문  (0) 2022.04.18
축약 연산자 (operator abbreviation)  (0) 2022.04.09