Java Scanner 클래스는 java.util 패키지의 일부입니다. 이는 Java 1.5 릴리스에서 소개되었습니다. Scanner는 대부분 사용자 입력을 받아들이고 int, double 또는 기본 String과 같은 기본 데이터 유형으로 구문 분석하는 데 사용됩니다. 이는 토큰을 생성하여 정규 표현식을 사용하여 데이터를 구문 분석하는 유틸리티 클래스입니다.
Java Scanner 클래스 생성자
Scanner 클래스를 살펴보면 여러 생성자가 있습니다.

대부분의 생성자는 세 개의 객체 중 하나를 사용합니다:
- InputStream – 사용자 입력을 받기 위해 System.in을 전달하는 가장 일반적인 방법입니다.
- File 또는 Path – 파일 데이터를 스캔하고 파일에서 값들을 처리할 수 있습니다.
- String – 문자열 소스에 대한 스캐너를 만들고 그 값들을 구문 분석할 수 있습니다.
두 번째 인수를 살펴보면, 기본 문자 집합을 사용하지 않으려면 문자 집합을 지정하는 것입니다.
Scanner 클래스의 중요한 메서드
가장 일반적으로 사용되는 Scanner 클래스 메서드 몇 가지를 살펴보겠습니다.
- useDelimiter(String pattern) – 스캐너에 사용할 구분자입니다. 기본 구분자는 공백입니다.
- hasNext() – 입력에 다른 토큰이 있으면 true를 반환합니다. 이것은 블로킹 메서드이며 사용자 입력을 기다리게 됩니다.
- next() – 스캐너에서 다음 토큰을 반환합니다. hasNext() 메서드와 함께 사용됩니다.
- close() – 스캐너는 자원을 많이 사용하므로 사용이 완료되면 이 메서드를 사용하여 닫고 시스템 자원을 해제하십시오.
입력 토큰을 int, short, long, byte, BigDecimal 등으로 직접 확인하고 구문 분석하는 유틸리티 메서드가 많이 있습니다.
스캐너 초기화 및 사용 단계
- 첫 번째 단계는 InputStream, File 또는 String과 같은 입력 유형에 따라 적절한 생성자를 사용하여 스캐너 클래스를 초기화하는 것입니다. 필요한 경우 구분 기호와 문자 집합을 설정하십시오.
- 두 번째 단계는 hasNext() 메서드를 사용하여 입력 토큰을 기다리는 것입니다.
- 그런 다음 next() 메서드를 사용하여 토큰을 읽고 하나씩 처리합니다.
스캐너 작동 방식
- Scanner 클래스는 지정된 구분 기호 패턴을 사용하여 입력을 토큰으로 분할합니다.
- next() 메서드는 토큰을 하나씩 읽고 처리하는 데 사용됩니다.
- 시스템 리소스를 해제하기 위해 마지막으로 Scanner 인스턴스를 닫아주세요.
Scanner 예제
Scanner 클래스의 일반적인 사용법과 샘플 코드 스니펫을 살펴보겠습니다.
1. 사용자 입력 읽기
Scanner 클래스의 가장 일반적인 사용법입니다. 입력 소스로 System.in을 사용하여 사용자 입력을 읽을 수 있습니다.
// 사용자 입력 읽기
Scanner sc = new Scanner(System.in);
System.out.println("Please enter your name");
String name = sc.next();
System.out.println("Hello " + name);
sc.close();
출력:
Please enter your name
Pankaj
Hello Pankaj
잘 보이고 작동하는 것 같습니다. 그러나 위의 코드에는 문제가 있습니다. 다음 섹션을 읽기 전에 코드를 확인하고 문제를 찾아보시겠습니까?
입력에 전체 이름을 작성할 때 어떻게 되는지 확인해봅시다.
Please enter your name
Pankaj Kumar
Hello Pankaj
이제 이해하셨을 것입니다. 이는 공백이 구분자로 사용되기 때문에 발생하는 문제입니다. Scanner는 입력을 두 개의 토큰, “Pankaj”와 “Kumar”으로 나누고 있지만, 우리는 next() 메서드를 한 번만 호출하고 있으므로 “Hello Pankaj”만 출력됩니다.
어떻게 해결할까요?
간단합니다. useDelimiter() 메서드를 사용하여 구분자를 줄 바꿈 문자로 변경할 수 있습니다.
Scanner sc = new Scanner(System.in);
sc.useDelimiter(System.getProperty("line.separator"));
System.out.println("Please enter your name");
String name = sc.next();
System.out.println("Hello " + name);
sc.close();
2. Scanner를 사용하여 파일 데이터 구문 분석하기
Scanner 클래스를 사용하여 CSV 파일을 읽고 구문 분석하는 간단한 예제를 살펴보겠습니다. 예를 들어, 다음과 같은 내용을 갖는 employees.csv 파일이 있다고 가정해 봅시다.
1,Jane Doe,CEO
2,Mary Ann,CTO
3,John Lee,CFO
파일을 읽고 Java 프로그램에서 Employee 목록을 가져와 봅시다.
package com.journaldev.java;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class ScannerExamples {
public static void main(String[] args) throws IOException {
// create scanner for the CSV file
Scanner sc = new Scanner(new File("employees.csv"));
// set delimiter as new line to read one line as a single token
sc.useDelimiter(System.getProperty("line.separator"));
// create the List of Employees
List<Employee> emps = new ArrayList<>();
while (sc.hasNext()) {
Employee emp = parseEmployeeData(sc.next());
emps.add(emp);
}
// close the scanner
sc.close();
// print employee records
System.out.println(emps);
}
private static Employee parseEmployeeData(String record) {
// create scanner for the String record
Scanner sc = new Scanner(record);
// set delimiter as comma
sc.useDelimiter(",");
Employee emp = new Employee();
emp.setId(sc.nextInt());
emp.setName(sc.next());
emp.setRole(sc.next());
// close the scanner
sc.close();
return emp;
}
}
class Employee {
private int id;
private String name;
private String role;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
@Override
public String toString() {
return "Emp[" + id + "," + name + "," + role + "]";
}
}
- // CSV 파일용 스캐너 생성
- // 새 줄을 구분자로 설정하여 한 줄을 단일 토큰으로 읽기
- // Employee 목록 생성
// 스캐너 닫기
// 직원 레코드 출력
// 문자열 레코드용 스캐너 생성
// 쉼표를 구분자로 설정
String data = "1a2b345c67d8,9#10";
Scanner sc1 = new Scanner(data);
// 스캐너 닫기
sc1.useDelimiter("\\D");
while(sc1.hasNext()) {
System.out.println(sc1.next());
}
첫 번째 단계는 CSV 파일용 스캐너를 생성하고 새 줄을 구분자로 설정하는 것입니다.
sc1.close();
그런 다음 CSV 형식의 직원 레코드를 포함하는 각 줄에 대해 다른 스캐너와 쉼표를 구분자로 사용하여 구문 분석합니다. parseEmployeeData()는 각 줄을 구문 분석하고 Employee 객체를 생성합니다.
1
2
345
67
8
9
10
마지막으로, 직원 객체를 목록에 추가하고 출력합니다.
출력: [Emp[1,Jane Doe,CEO], Emp[2,Mary Ann,CTO], Emp[3,John Lee,CFO]]
Source:
https://www.digitalocean.com/community/tutorials/scanner-class-in-java