[Java]Scanner클래스와 메소드

Euiyeon Park·2024년 9월 3일
0

Java

목록 보기
8/16
post-thumbnail

🖨️ Scanner

Scanner 클래스는 Java에서 표준 입력(콘솔 입력)이나 파일, 문자열 등의
다양한 입력 소스로부터 데이터를 읽어오는 데 사용되는 유틸리티 클래스다.

Scanner는 Java의 java.util 패키지에 포함되어 있으며,
사용자가 입력한 데이터를 파싱하는 다양한 메소드를 제공하고
입력된 데이터를 적절한 타입으로 자동으로 변환하여 반환한다.

📍 Scanner 특징

  1. 다양한 입력 소스
    콘솔, 파일, 문자열 등 다양한 입력 소스로부터 데이터를 읽는다.
  2. 자동 타입 변환
    입력된 데이터를 적절한 타입으로 자동으로 변환하여 반환한다.
  3. 토큰 기반 입력 처리
    공백, 줄바꿈 등 구분자를 기준으로 입력 데이터를 여러 토큰으로 나누어 처리한다

📍 Scanner의 주요 생성자

  1. Scanner(InputStream source)
    System.in을 인자로 전달해 콘솔에서 입력을 받을 수 있다.
Scanner sc = new Scanner(System.int);
  1. Scanner(File source)
    파일을 읽어올 때 사용한다.
File file = new File("input.txt");
Scanner sc = new Scanner(file);
  1. Scanner(String source)
    문자열을 입력 소스로 사용한다.
String data = "Hello World!";
Scanner sc = new Scanner(data);

🖨️ Scanner의 주요 메서드

메서드동작반환 타입
next()공백을 기준으로 다음 토큰(단어)를 읽음String
nextLine()줄바꿈 문자를 기준으로 입력을 읽음String
nextInt()다음 입력을 정수(int)로 읽음int
nextDouble()다음 입력을 실수(double)로 읽음double
nextBoolean()다음 입력을 논리값(boolean)으로 읽음boolean
hasNext()다음에 읽을 수 있는 토큰이 있는지 확인boolean
hasNextLine()다음 줄이 있는지 확인boolean
useDelimiter(String pattern)입력을 구분하는데 사용할 패턴 설정(기본은 공백, 줄바꿈)Scanner(자기 자신)
close()객체를 닫아 자원을 해제

📍 사용 예제

public class Main{
    public static void main(String[] args){

        // 1. 문자열을 입력 소스로 하는 Scanner 객체 생성
        String input = "Java 101\nIntelliJ\n3.14 true\nHello,World! Bye, World!, 42";
        Scanner sc = new Scanner(input);

        // 2. next() - 공백 전까지의 문자열 읽기
        System.out.println("First Word: " + sc.next());

        // 3. nextInt() - 정수 읽기
        System.out.println("Integer: " + sc.nextInt());

        // 4. nextLine() - 한 줄 전체 읽기
        sc.nextLine();      // 한 줄 이동
        System.out.println("Line: " + sc.nextLine());

        // 5. nextDouble() - 실수 읽기
        System.out.println("Double: " + sc.nextDouble());

        // 6. nextBoolean() - boolean값 읽기
        System.out.println("Booelan: " + sc.nextBoolean());

        // 7. hasNext() - 다음 토큰이 있는지 확인
        if(sc.hasNext()){
            System.out.println("Next Tocken: " + sc.next());
        }

        // 8. useDelimiter - 구분자 변경(공백 → 콤마)
        sc.useDelimiter(",");
        System.out.println("First Word: " + sc.next().trim());
        System.out.println("Second Word: " + sc.next().trim());

        sc.useDelimiter("\\s*,\\s*"); // 콤마와 주변 공백을 모두 구분자로 설정

        // 9. hasNextLine() - 다음 줄이 있는지 확인
        if(sc.hasNextLine()){
            System.out.println("Last Integer: " + sc.nextInt());
        }

        // 10. close - Scanner 객체 닫기
        sc.close();
    }
}
  • Scanner의 메소드는 입력을 처리한 후, 다음 토큰을 읽기 위해 커서를 이동 시킨다.
    • 공백을 자동으로 건너뛰고 입력을 처리한다.

📍 사용자 입력을 받을 때 주의할 점 - nextInt() / nextLine()

nextInt()에서 정수를 입력하고 nextLine()에서 문자열을 입력한 뒤
각각의 입력값인 inputIntinputString을 출력하려고 하면,
예상 동작과 다르게 문자열을 입력하지 못하고, 문자열의 입력값도 공백으로 출력된다.

원인은 두 메서드 간의 동작 차이 때문에 문제가 발생한다.

📍 nextInt()와 nextLine()의 메서드 동작 차이

  1. nextInt()
    nextInt()는 사용자가 정수를 입력하고 개행 문자(Enter)를 치면
    입력 버퍼에 해당 정수 뒤에 오는 개행 문자를 남긴다.

  2. nextLine()
    nextLine()은 입력 버퍼에서 개행 문자를 만나면 줄을 끝냈다고 판단하고
    그 다음 줄을 읽기 시작한다. - 개행 문자 단위로 읽는다

    하지만 nextInt()로 인해 개행 문자가 버퍼에 남아 있으면
    nextLine()은 이 남아있는 개행 문자로 인해 빈 문자열을 읽게 된다.

이로 인해, nextLine() 메서드가 새로운 문자열 입력을 기다리지 않고,
버퍼에 남아 있는 개행 문자를 읽어 빈 문자열을 반환하게 된다.

📍 해결 방법

정수를 입력받은 후 nextLine()을 호출해 추가적으로 한 줄을 읽어 개행 문자를 소비한다.


profile
"개발자는 해결사이자 발견자이다✨" - Michael C. Feathers

0개의 댓글