MODE::CREATIVE

[JAVA] java의 입력(Scanner) 본문

JAVA

[JAVA] java의 입력(Scanner)

LEE MINGYU 2024. 11. 10. 16:59

1. 입력 처리

Java에서 입력 처리는 주로 System.inScanner 클래스를 통해 이루어집니다. 입력 처리는 사용자와 프로그램이 상호작용할 수 있도록 하며, 다양한 데이터 타입의 값을 입력받을 수 있습니다.


1-1. System.in

System.in은 표준 입력 스트림으로, 바이트 단위로 데이터를 읽어옵니다. 하지만 System.in은 숫자나 문자를 직접 변환하지 않기 때문에, 대부분의 경우 직접 사용하기보다 Scanner와 함께 사용하는 것이 좋습니다.

InputStream input = System.in;

1-2. Scanner 클래스

Scanner 클래스는 java.util 패키지에 포함된 클래스로, 다양한 타입의 데이터를 입력받을 수 있도록 지원합니다. Scanner를 사용하려면 다음과 같이 import 문을 추가해야 합니다.

import java.util.Scanner;

1-3. Scanner 객체 생성

Scanner 객체는 System.in을 통해 입력된 데이터를 처리하도록 설정할 수 있습니다. 일반적으로 입력 처리를 위한 Scanner 객체는 프로그램 시작 시 생성하고, 더 이상 사용하지 않으면 닫아주는 것이 좋습니다.

Scanner scanner = new Scanner(System.in);

1-4. Scanner 메소드로 데이터 읽기

Scanner 클래스는 입력값을 다양한 데이터 타입으로 읽어올 수 있는 메소드를 제공합니다. 이 메소드를 사용하면 문자열뿐만 아니라 정수, 실수 등도 손쉽게 입력받을 수 있습니다.

  • 문자열 입력: nextLine() 또는 next()
    • next() : 공백 전까지의 단어를 읽음
    • nextLine() : 한 줄 전체를 읽음
      System.out.print("이름을 입력하세요: ");
      String name = scanner.nextLine();  // 줄 단위로 문자열 읽기
  • 정수 입력: nextInt()
  • System.out.print("나이를 입력하세요: ");
    int age = scanner.nextInt(); // 정수 입력
  • 실수 입력: nextDouble()
  • System.out.print("몸무게를 입력하세요: ");
    double weight = scanner.nextDouble(); // 실수 입력
  • 논리값 입력: nextBoolean()
  • System.out.print("독신 여부를 입력하세요 (true/false): "); 
    boolean isSingle = scanner.nextBoolean(); // 논리값 입력

1-5. Scanner 메소드의 다양한 기능

Scanner 클래스는 문자열을 다양한 타입으로 변환할 수 있어 편리하며, 또한 특정 구분자를 기준으로 데이터를 분리하여 읽을 수 있는 기능도 제공합니다.

  • 구분자를 기준으로 입력 나누기: 기본적으로 Scanner는 공백, 개행 문자 등을 기준으로 데이터를 구분하지만, useDelimiter() 메소드를 통해 구분자를 지정할 수 있습니다.
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            String input = "apple,banana,cherry";
            Scanner scanner = new Scanner(input);
            scanner.useDelimiter(",");
    
            while (scanner.hasNext()) {
                System.out.println(scanner.next().trim());
            }
    
            scanner.close();
        }
    }

 

1-6. Scanner 예제

아래는 Scanner 클래스를 사용하여 다양한 데이터 타입을 입력받는 예제입니다.

import java.util.Scanner;

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

        // 문자열 입력
        System.out.print("이름을 입력하세요: ");
        String name = scanner.nextLine();

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

        // 실수 입력
        System.out.print("몸무게를 입력하세요: ");
        double weight = scanner.nextDouble();

        // 논리값 입력
        System.out.print("독신 여부를 입력하세요 (true/false): ");
        boolean isSingle = scanner.nextBoolean();

        // 출력
        System.out.println("이름: " + name);
        System.out.println("나이: " + age);
        System.out.println("몸무게: " + weight);
        System.out.println("독신 여부: " + isSingle);

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

1-7. 입력 예외 처리

입력값이 예상한 타입과 다를 경우 예외가 발생할 수 있습니다. 예를 들어, nextInt() 메소드를 사용할 때 숫자가 아닌 값을 입력하면 InputMismatchException이 발생합니다. 이를 방지하기 위해 try-catch 문을 사용하여 예외를 처리할 수 있습니다.

try {
    System.out.print("나이를 입력하세요: ");
    int age = scanner.nextInt();
} catch (InputMismatchException e) {
    System.out.println("유효한 숫자를 입력해 주세요.");
    scanner.next(); // 버퍼에 남은 잘못된 입력 제거
}

1-8. Scanner와 System.in 주의사항

  • 버퍼 문제: nextInt()nextLine()을 혼용할 경우 입력 버퍼에 개행 문자가 남아 다음 입력에 영향을 줄 수 있습니다. 이를 방지하기 위해 nextLine()을 사용해 버퍼를 비울 수 있습니다.
  • int age = scanner.nextInt(); scanner.nextLine(); // 남은 개행 문자 제거
    String name = scanner.nextLine();
  • Scanner 객체 닫기: 프로그램 종료 시 scanner.close()를 호출해 Scanner 객체를 닫아 자원을 해제하는 것이 좋습니다. 다만, 여러 입력 처리를 위해 반복적으로 Scanner를 닫고 새로 생성하지 않는 것이 바람직합니다.

1-9. Scanner로 파일 입력 처리

Scanner는 파일 입력을 처리할 때도 유용하게 사용할 수 있습니다. File 객체와 함께 Scanner를 생성하여 파일의 내용을 읽을 수 있습니다.

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class FileInputExample {
    public static void main(String[] args) {
        try {
            File file = new File("data.txt");
            Scanner scanner = new Scanner(file);

            while (scanner.hasNextLine()) {
                String line = scanner.nextLine();
                System.out.println(line);
            }
            scanner.close();
        } catch (FileNotFoundException e) {
            System.out.println("파일을 찾을 수 없습니다.");
        }
    }
}

이처럼 Scanner 클래스는 다양한 입력을 손쉽게 처리할 수 있어 Java의 입력 처리에 중요한 역할을 합니다. nextLine()nextInt() 메소드 등 Scanner의 다양한 기능을 이해하고 활용하면, 입력 데이터를 효과적으로 관리할 수 있습니다.