자바 Scanner

정주영·2024년 12월 10일

자바

목록 보기
3/10

1. Scanner란?

Scanner 클래스는 자바에서 입력을 읽어오는 데 사용되는 표준 도구입니다.

위치: java.util 패키지에 포함

기능:

  • 키보드 입력 처리
  • 파일, 문자열, InputStream에서 데이터 읽기
  • 다양한 데이터 타입의 입력 지원 (int, double, String, 등)
  • 데이터를 구분자(Delimiter)로 나누어 처리 가능

기본 역할:

  • 입력 스트림을 읽어옵니다.
  • 데이터를 지정된 타입으로 변환합니다.
  • 변환된 데이터를 반환합니다.

2. Scanner를 사용하려면

Scanner를 사용하기 위해서는 다음 단계를 따라야 합니다:

(1) Scanner 클래스 임포트

Scanner 클래스는 기본적으로 제공되지만, java.util 패키지에 속해 있으므로 명시적으로 import 해야 합니다.

import java.util.Scanner;

(2) Scanner 객체 생성

Scanner 객체는 입력 소스를 생성자에 전달하여 초기화합니다. 대표적인 생성자 사용법은 다음과 같습니다:

키보드 입력: new Scanner(System.in)
파일 입력: new Scanner(new File("파일경로"))
문자열 입력: new Scanner("입력 문자열")

(3) 입력 처리 메서드 호출

Scanner는 다양한 데이터 타입에 맞는 메서드를 제공합니다.

정수 입력: nextInt() 정수 단위로 값를 입력받는다.
실수 입력: nextDouble() 실수 단위로 값을 입력받는다.
문자열 입력: nextLine() 줄 단위로 문자열을 입력받는다.

추가 정보: hasNextInt() 는 입력 스트림에서 다음 토큰이 정수로 변환 가능한지를 확인하는 메서드입니다. true 또는 false를 반환합니다 hasNextDouble()hasNextLine() 이와 동일

  • true: 다음 토큰이 정수로 변환 가능.
  • false: 다음 토큰이 정수가 아니거나 입력 스트림이 비어 있음.

3. 키보드 입력 처리 예제

키보드에서 데이터를 읽어오는 기본적인 예제입니다:

import java.util.Scanner;


public class ScannerExample {
    public static void main(String[] args) {
        // 1. Scanner 객체 생성 (키보드 입력)
        Scanner scanner = new Scanner(System.in);

        // 2. 사용자로부터 입력받기
        System.out.print("이름을 입력하세요: ");
        String name = scanner.nextLine(); // 문자열 입력

        System.out.print("나이를 입력하세요: ");
        int age = scanner.nextInt(); // 정수 입력

        // 3. 결과 출력
        System.out.println("안녕하세요, " + name + "님! 당신의 나이는 " + age + "살입니다.");

        // 4. Scanner 객체 닫기
        scanner.close();
    }
}

4. 다양한 데이터 타입 입력

Scanner는 다양한 데이터 타입을 처리할 수 있습니다. 아래 예제는 각 타입의 입력을 받는 방법을 보여줍니다:

import java.util.Scanner;

public class DataTypeExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("정수를 입력하세요: ");
        int integerValue = scanner.nextInt();

        System.out.print("실수를 입력하세요: ");
        double doubleValue = scanner.nextDouble();

        System.out.print("문자열을 입력하세요: ");
        scanner.nextLine(); // 남아있는 줄바꿈 처리
        String stringValue = scanner.nextLine();

        System.out.println("입력된 정수: " + integerValue);
        System.out.println("입력된 실수: " + doubleValue);
        System.out.println("입력된 문자열: " + stringValue);

        scanner.close();
    }
}

5. 구분자(Delimiter) 활용

Scanner는 기본적으로 공백(스페이스, 탭, 줄바꿈)을 데이터 구분자로 사용합니다. 그러나 사용자가 원하는 구분자를 지정할 수도 있습니다.

(1) 기본 구분자 사용

Scanner scanner = new Scanner("Hello World Java");
while (scanner.hasNext()) {
    System.out.println(scanner.next()); // 공백 기준으로 단어 출력
}
scanner.close();
Hello
World
Java

(2) 커스텀 구분자 지정

Scanner scanner = new Scanner("Apple,Banana,Cherry");
scanner.useDelimiter(","); // 콤마를 구분자로 설정

while (scanner.hasNext()) {
    System.out.println(scanner.next());
}
scanner.close();
Apple
Banana
Cherry

6. 예외 처리

Scanner 사용 시, 입력값이 예상한 데이터 타입과 맞지 않으면 예외가 발생할 수 있습니다. 이를 방지하기 위해 예외 처리를 추가하는 것이 중요합니다.

예외 처리 예제:

import java.util.Scanner;

public class ExceptionHandlingExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        try {
            System.out.print("정수를 입력하세요: ");
            int number = scanner.nextInt();
            System.out.println("입력된 정수: " + number);
        } catch (Exception e) {
            System.out.println("유효하지 않은 입력입니다. 정수를 입력해주세요.");
        } finally {
            scanner.close(); // 항상 Scanner 닫기
        }
    }
}

7. Scanner의 장점과 주의점

장점:

  • 간편하게 다양한 타입의 입력 처리
  • 파일, 문자열 등 다양한 입력 소스 지원
  • 기본 구분자 외에 커스텀 구분자 지정 가능

주의점:

  • 입력 버퍼 문제:
  • nextInt(), nextDouble() 등 숫자 입력 후 nextLine() 호출 시, 줄바꿈이 남아 문제를 일으킬 수 있음.

해결법: scanner.nextLine() 을 추가하여 버퍼를 비우기.

scanner.nextLine(); // 줄바꿈 처리
// 객체 닫기 필수:
// Scanner를 닫지 않으면 자원을 낭비하게 됩니다. 항상 scanner.close() 호출.

8. Scanner로 할 수 있는 추가적인 작업

파일 입력:

Scanner fileScanner = new Scanner(new File("data.txt"));
while (fileScanner.hasNextLine()) {
    System.out.println(fileScanner.nextLine());
}
fileScanner.close();

문자열 파싱:

Scanner stringScanner = new Scanner("100 200 300");
int sum = 0;
while (stringScanner.hasNextInt()) {
    sum += stringScanner.nextInt();
}
System.out.println("합계: " + sum);
stringScanner.close();
profile
효율적인 시스템 설계를 고민하며, 확장성과 안정성을 갖춘 백엔드 개발자가 되길 희망합니다.

0개의 댓글