본문 바로가기
Programming/Java

[Java] 8. Scanner

by Rayched 2022. 12. 4.

1. 개요

이번에 정리한 것은 자바에서 사용되는 여러가지 입력 방법 중 하나인 Scanner 클래스에 대한 것이다.

바로 Scanner 클래스가 가진 특징을 확인하고, 예제문제로 넘어가도록 하겠다.


2. Scanner 클래스

① Scanner의 특징

 - 정수, 실수, 문자열과 같은 기본적인 데이터 타입을 가진 값들을

    Scanner가 가진 메소드를 사용해서 입력받을 수 있다.

 - Scanner를 사용할 때는 'java.util' 패키지에서 Scanner 클래스와 관련된 패키지를 호출해야만 사용할 수 있다.

    (자바에서 사용되는 대부분의 클래스들은 lang 패키지가 아니라면 import를 통해서 호출해야만 한다.)

 - 공백(띄어쓰기)이나 ' ', '\n'과 같은 줄바꿈을 기준으로 데이터를 읽는다.

    이를 통해서 사용자의 편의에 따라 쉽게 데이터를 입력받을 수 있다.

 

② Scanner 메소드

메소드 설명
nextByte(); byte 형 입력 및 return
nextShort(); short 형 입력 및 return
nextInt(); int 형 입력 및 return
nextLong(); long 형 입력 및 return
nextFloat(); float 형 입력 및 return
nextDouble(); double 형 입력 및 return
nextBoolean(); boolean 형 입력 및 return
next(); String 형 입력 및 return
nextLine(); * String 형 입력 및 return

상단의 표는 Scanner 클래스가 가진 메소드를 정리한 표이다.

여기서 유의해야 할 부분은 'nextLine()' 메소드이다.

'nextByte()' 부터 'next()' 메소드는 '\n'과 같은 줄바꿈이나 공백까지만 읽지만

반대로 'nextLine()' 메소드는 enter를 기준으로 줄바꿈이나 공백도 읽는다.

이것만으로는 설명이 안되니깐 예제 코드를 같이 보면서 설명하도록 하겠다.

 

③ Scanner 예제

import java.util.Scanner;
//Scanner 클래스 호출

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //Scanner 객체 생성
        
        int num = sc.nextInt();
        String text = sc.nextLine();
        
        System.out.println("입력받은 숫자: "+ num);
        System.out.println("입력받은 문장: "+ text);
    }
}

위와 같이 소스코드를 작성하고 프로그램을 실행시켜보자.

프로그램 실행 결과

정수를 입력하고 Enter를 누르면, 다음 문장을 입력할 수 없고

입력받은 숫자를 보여주고, 입력받은 문장 부분에는 공백만 나오는 것을 확인할 수 있다.

앞에서도 설명했지만 'nextInt()' 메소드는 줄바꿈이나 공백까지 읽는다고 했었다.

좀 더 정확하게 말해보자면 줄바꿈이나 공백을 기준으로 읽기 때문에, 해당 부분은 제외하고 읽는 것이다.

만약 정수 5를 입력했다면, nextInt() 메소드는 '5'까지만 읽고 그걸 변수 num에 저장한다.

다만 공백이 사라지지 않은 상태로 nextLine() 메소드가 실행된다.

'nextLine()' 메소드는 enter를 기준으로 줄바꿈이나 공백도 읽을 수 있다.

즉,  nextInt()가 읽지 않는 공백을 읽고 그걸 변수 text에 저장해버린다.

 

따라서 이후 문장도 입력을 하려면 변수 num과 text 사이에 nextLine() 메소드를 하나 더 추가하면 된다.

import java.util.Scanner;
//Scanner 클래스 호출

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //Scanner 객체 생성

        int num = sc.nextInt();
        sc.nextLine(); //nextInt가 읽지 않은 공백이나 줄바꿈을 읽는다.
        String text = sc.nextLine();

        System.out.println("입력받은 숫자: "+ num);
        System.out.println("입력받은 문장: "+ text);
    }
}

프로그램 실행 결과

nextInt() 메소드가 정수 5를 읽고, 해당 값을 변수 num에 저장한다.

이후 읽지 않고 남은 공백 부분은 바로 아래 줄의 nextLine() 메소드가 읽는다. (값을 저장할 변수는 없음)

그리고 문장 Hello를 nextLine() 메소드가 읽고, 해당 문장을 변수 text에 저장한다.


import java.util.Scanner;
//Scanner 클래스 호출

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //Scanner 객체 생성

        String num = sc.next();
        //sc.nextLine();
        String text = sc.nextLine();

        System.out.println("입력받은 숫자: "+ num);
        System.out.println("입력받은 문장: "+ text);
    }
}

 

프로그램 실행 결과

next(), nextLine() 둘 다 String 형 입력 값을 읽고 return 하는 메소드지만

next()는 공백을 기준으로 공백이나 줄바꿈은 제외하고 읽는다.

nextLine()은 enter를 기준으로 읽으며 공백이나 줄바꿈도 읽어버린다.

그렇기 때문에 next() 메소드는 "Hello World" 문장에서 "Hello"까지만 읽고

그 문장을 변수 num에 저장한다.

이후 남은 "_World" 문장은 nextLine() 메소드가 읽고

해당 문장을 변수 text에 저장하기 때문에 이러한 결과가 나왔다.


3. 마치며

지금까지 자바를 공부하면서 어려웠다고 느낀 것 중 하나가 바로 Scanner 부분이다.

학원에서 배웠을 때는 그냥 이런게 있구나 식으로 넘어갔지만

이후 개인 프로젝트를 하면서 필요에 의해 Scanner 클래스에 대해 조사를 해보니

생각했던 것보다 어려운 내용이 많았다.

그래도 다른 사람들이 작성했던 글들을 참고하면서실제로 예제 코드를 작성하고 실행해보면서왜 이런 식의 결과가 나왔는 지에 대해 이해하기 위해서계속 생각을 하다보니

나름대로 재밌게 공부한 것 같다.

'Programming > Java' 카테고리의 다른 글

[Java] 10. 상속 (Inheritance)  (0) 2022.12.22
[Java] 9. static  (0) 2022.12.21
[Java] 함수, 메소드  (0) 2022.11.30
[Java] 7. 클래스와 객체 (Part 2)  (0) 2022.11.21
[Java] 7. 클래스와 객체 (Part 1)  (0) 2022.10.28