본문 바로가기
[ JAVA ]/JAVA

[ Java ] Scanner

by 환이s 2022. 12. 29.
CHAPTER 16. Scanner 알아가기

 

오늘은 java.util 패키지에 포함되어 있는 Scanner 클래스의 사용법에 대해 알아보도록 하겠습니다.

 

자바를 처음 배울 때 아마 대부분은 키보드로 입력받기 위해 Scanner라는 클래스를 썼을 거예요! 자바 외에도 다양한 언어들은 각각의 입력 방식이 있고, 각 언어별로 대표하는 대중적인 입력방식이 하나씩 있습니다. 자바에서도 여러 가지 입력 방법이 있는데, 그중에 가장 쉬우면서도 대중적인 입력 중 대표적인 것이 바로 Scanner 클래스를 이용한 입력입니다.

 

1 ) Scanner 클래스 특징

 

- Scanner 클래스란 화면으로부터 데이터를 입력받는 기능을 제공하는 클래스입니다. 카톡에서 메시지를 입력 후 전송 버튼을 누르면 상대방에게 메세지가 전송되듯 메세지 대신 값을 입력받는 기능입니다.

 

- java.util 패키지 내에 존재하는 클래스입니다. 정수(int), 실수(double),문자열(String)등의 기본적인 데이터 타입 입력을 받기 위한 클래스 입니다.

(입력을 받고 싶으면 next(), nextLine(),nextint()등 Scanner의 주요 메서드를 사용하는데 자세한 부분은 아래에서 확인해보자!

 

-Scanner의 입력 메서드들은 대부분 공백과 개행('', '\t' , '\r', '\n' 등..)을 기준으로 읽어서 사용자의 편의에 따라 쉽게 입력을 받을 수 있습니다.

 

2 ) Scanner 주요 메서드

메서드  설 명
String next() 다음 토큰(Token)을 문자열로 리턴 해줍니다.
byte nextByte() 다음 토큰(Token)을 byte 타입으로 리턴 해줍니다.
short nextShort() 다음 토큰(Token)을 short  타입으로 리턴 해줍니다.
int nextInt() 다음 토큰(Token)을 int 타입으로 리턴 해줍니다.
long nextLong() 다음 토큰(Token)을 long 타입으로 리턴 해줍니다.
float nextFloat() 다음 토큰(Token)을 float 타입으로 리턴 해줍니다.
double nextDouble() 다음 토큰(Token)을 double 타입으로 리턴 해줍니다.
String NextLinte() '\n'을 포함하는 한 라인을 읽고 '\n'을 버린 나머지만 리턴 해줍니다.
void close() Scanner 사용 종료

※ 토큰(Token) : 공백 문자(Spacebar), 탭(Tab), 개행(Enter)등으로 구분되는 요소입니다.

 

3 ) Scanner 클래스 기본 사용법

import java.util.Scanner; // import문 필요합니다.

Scanner sc = new Scanner(System.in); // Scanner 객체

Scanner 클래스도 객체를 생성해야만 기능을 사용할 수 있는 것이 있고 생성하지 않아도 되는 클래스가 있습니다.

println() 메서드와 같은 것은 객체를 생성하지 않고 사용 가능하지만 Scanner클래스는 꼭 객체를 생성해야만 사용할 수 있습니다.

 

System.in 이란??

 

- System.in은 화면에서 입력을 받겠다는 의미입니다. Scanner클래스는 화면뿐만 아니라 파일로부터 입력을 받을 수 있는데 화면으로부터 정수형, 소수형과 같은 데이터 타입을 입력받을 것이기 때문에 System.in을 사용합니다.

 

- Ssytem.in은 입력한 값을 Byte 단위로 읽으며 키보드와 연결된 자바의 표준 입력 스트림입니다.

 

예제 1 ) Scanner 사용 예제

 

 

위 예제에 나오는 nextInt()와 같이 타입을 지정해서 받는 메서드는 'Enter'값을 무시하고 해당 타입만 받아 변환하여 반환합니다.

그리고 Scanner의 사용이 끝났다면 굳이 close()로 닫아줄 필요는 없지만 닫아주는 습관을 기르도록 합시다!

 

 

예제 2 ) Scanner 무한 루프

 

실무에서는 Scanner를 무한루프로 돌려야 하는 상황이 있습니다. 예를 들면 식당에 있는 키오스크를 보면 중식집만 가도 메뉴가 다양하게 있습니다. 면요리, 볶음요리 등등 메뉴가 많을 때 무한루프를 돌리는 경우가 있는데 조건식 while문을 사용해 보자!

 

간단한 예시로 입력받은 데이터 값을 무한 루프 돌려서 값을 누적시켜 보았는데 아래 예시를 참고해 봅시다.

 

 

예제 3 ) Scanner 무한 루프 배열 활용하기

 

위 예제와 동일하게 무한 루프로 값을 출력하지만 이전에 배웠던 배열까지 활용해서 원하는 메뉴를 출력해 봅시다.

 

 import java.util.Scanner;

public class My_First_Menu {
    public static void main(String[] args) {
        String[] menuArr = new String[3];
        menuArr[0] = "(1) 한식";
        menuArr[1] = "(2) 양식";
        menuArr[2] = "(3) 중식";

        String[] kFoodArr = new String[4];
        kFoodArr[0] = "(1) 김치찌개";
        kFoodArr[1] = "(2) 된장찌개";
        kFoodArr[2] = "(3) 삼겹살";
        kFoodArr[3] = "(4) 비빔밥";

        String[] eFoodArr = new String[3];
        eFoodArr[0] = "(1) 돈까스";
        eFoodArr[1] = "(2) 비프스테이크";
        eFoodArr[2] = "(3) 카레라이스";

        String[] cFoodArr = new String[3];
        cFoodArr[0] = "(1) 짜장면";
        cFoodArr[1] = "(2) 짬뽕";
        cFoodArr[2] = "(3) 탕수육";

먼저 배열에 각각의 메뉴를 담아주고 Scanner 클래스를 구현해봅시다. 

 Scanner sc = new Scanner(System.in);
        System.out.print("== [ 메뉴 ] ==");


        int n;
        while (true) {
            for (String s : menuArr) {
                System.out.println(s);

            }
            System.out.print("원하는 메뉴(1~3)를 선택하세요.(종료:0)>");

            n = sc.nextInt();
            if (n == 0) break;
            if (n == 1) {
                System.out.println("[ 한식메뉴 ] ");
                for (String k : kFoodArr) {
                    System.out.println(k);
                }
                System.out.print("한식메뉴를 선택하세요.(한식메뉴선택종료:0, 전체종료:99)>");
                n = sc.nextInt();
                if (n == 0) continue;
                if (n == 99) break;
                System.out.println("고객님은 " + kFoodArr[n - 1] + "를 선택하셨습니다");

            } else if (n == 2) {
                System.out.println("[ 양식메뉴 ]");
                for (String e : eFoodArr) {
                    System.out.println(e);
                }

                System.out.print("양식메뉴를 선택하세요.(양식메뉴선택종료:0, 전체종료:99)>");
                n = sc.nextInt();
                if (n == 0) continue;
                if (n == 99) break;
                System.out.println("고객님은 " + eFoodArr[n - 1] + "를 선택하셨습니다");
            } else {
                System.out.println("[ 중식메뉴 ] ");
                for (String c : cFoodArr) {
                    System.out.println(c);
                }
                System.out.print("중식메뉴를 선택하세요.(중식메뉴선택종료:0, 전체종료:99)>");
                n = sc.nextInt();
                if (n == 0) continue;
                if (n == 99) break;
                System.out.println("고객님은 " + cFoodArr[n - 1] + "를 선택하셨습니다");
            }

        }

while문에 조건을 ture를 주고 무한루프를 돌리는데 주의할 점은 꼭 break; 걸어주는 거 잊지 마세요!

    System.out.println();
        if (n == 0) {
            System.out.println("프로그램을 종료합니다.");
        }

        if (n ==99){
            System.out.println("프로그램을 모두 종료합니다.");


        }

    }
}

무한루프에서 빠져나오는 값을 넣어주고 해당 값을 출력했을 때 나오는 문구까지 구현해보았습니다.

결과는 아래와 같습니다.

 

 

결과를 확인해 보면 무한루프가 제대로 가동하는 걸 볼 수 있는데 코드에 작성한 " 0 , 99" 값을 넣어줘야 프로그램이 종료됩니다.

 


마치며

 

Scanner에 대한 기본적인 사용 방법들을 알아보았습니다.

 

자바를 처음 접한 분들이라면 뒷부분의 내용은 조금 어려울 수 있지만,  자바를 공부할 때 순서가 있듯이 Scanner 클래스를 배우기 전 스트림에 대한 포스팅을 알아보고 이해하시는 걸 권장드립니다!

 

 

 

728x90

'[ JAVA ] > JAVA' 카테고리의 다른 글

[ Java ] 예외처리(Exception Handling)  (0) 2023.01.04
[ Java ] 내부 클래스(Inner Class)  (0) 2023.01.03
[ Java ] Collection Framework  (0) 2022.12.28
[ Java ] Generic  (0) 2022.12.26
[ Java ] JDK 기본 클래스 2  (0) 2022.12.25