Java Scanner 사용법
Java에서 Scanner
클래스는 사용자로부터 입력을 받거나 파일을 읽을 때 유용한 도구이다. java.util.Scanner
패키지에 포함되어 있으며, 다양한 입력 소스를 처리할 수 있다. 가장 일반적인 용도는 콘솔 입력 처리이며, 파일 또는 문자열 입력에도 사용된다.
1. Scanner 클래스 기본 사용법
Scanner를 사용하려면 먼저 import java.util.Scanner;
를 추가해야 한다. 그런 다음 System.in
을 사용하여 입력을 받을 수 있다.
import java.util.Scanner;
public class ScannerExample {
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.println("이름: " + name + ", 나이: " + age);
scanner.close(); // 리소스 해제를 위해 닫기
}
}
2. 다양한 입력 처리 방법
Scanner는 여러 가지 데이터 타입을 읽을 수 있다.
메서드 | 설명 |
---|---|
next() | 공백(스페이스, 개행 문자) 전까지 단어를 입력받음 |
nextLine() | 한 줄 전체를 입력받음 |
nextInt() | 정수를 입력받음 |
nextDouble() | 실수를 입력받음 |
nextBoolean() | true 또는 false 값을 입력받음 |
3. Scanner로 파일 읽기
파일을 읽을 때도 Scanner
를 사용할 수 있다.
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class FileScannerExample {
public static void main(String[] args) {
try {
File file = new File("example.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("파일을 찾을 수 없습니다.");
}
}
}
Java Scanner 닫는 방법
Scanner는 스트림을 사용하므로 반드시 닫아야 한다. 닫지 않으면 리소스 누수가 발생할 수 있다.
1. scanner.close()
사용하기
Scanner
는 내부적으로 입력 스트림을 사용하므로 close()
메서드를 호출하여 스트림을 닫아야 한다.
Scanner scanner = new Scanner(System.in);
// 입력 처리
scanner.close();
2. try-with-resources 사용하기
try-with-resources
를 사용하면 자동으로 Scanner
를 닫을 수 있다.
import java.util.Scanner;
public class TryWithResourcesExample {
public static void main(String[] args) {
try (Scanner scanner = new Scanner(System.in)) {
System.out.print("이름을 입력하세요: ");
String name = scanner.nextLine();
System.out.println("안녕하세요, " + name + "!");
} // 자동으로 scanner.close() 호출됨
}
}
Q&A
Q1. Scanner를 닫지 않으면 어떤 문제가 발생할까요?
Scanner는 내부적으로 입력 스트림(System.in
, 파일 스트림 등)을 사용한다. 이를 닫지 않으면 메모리 누수 및 리소스 낭비가 발생할 수 있다. 특히 파일을 다룰 때는 리소스를 정리하지 않으면 다른 프로그램이 파일을 열 수 없는 문제가 발생할 수 있다.
Q2. Scanner를 여러 번 열고 닫아도 되나요?
네, 가능하지만 System.in을 사용한 Scanner를 여러 번 열고 닫으면 문제가 발생할 수 있다. System.in
을 닫으면 이후에 다시 열 수 없으므로, 한 번만 생성하고 마지막에 닫는 것이 좋다.
Scanner scanner = new Scanner(System.in);
// 여러 입력 처리
scanner.close();
Q3. Scanner로 입력을 받을 때 nextLine()
과 nextInt()
를 함께 사용하면 문제가 발생하는 이유는?
nextInt()
를 호출하면 숫자만 읽고 개행 문자(\n
)를 남긴다. 이후 nextLine()
이 실행될 때, 개행 문자를 읽어 빈 입력처럼 동작한다.
해결 방법: nextLine()
을 추가해서 개행 문자를 처리한다.
Scanner scanner = new Scanner(System.in);
System.out.print("나이를 입력하세요: ");
int age = scanner.nextInt();
scanner.nextLine(); // 개행 문자 제거
System.out.print("이름을 입력하세요: ");
String name = scanner.nextLine();
System.out.println("이름: " + name + ", 나이: " + age);
scanner.close();
Q4. Scanner를 파일 입력에 사용할 때 주의할 점은?
- 파일이 존재하는지 먼저 확인해야 한다.
Scanner
가FileNotFoundException
을 발생시킬 수 있으므로 예외 처리가 필요하다.- 읽기가 끝나면 반드시
close()
를 호출해야 한다.
Q5. Scanner를 사용하지 않고 입력을 받는 다른 방법은?
- BufferedReader:
Scanner
보다 속도가 빠르며 대량의 데이터 처리에 유리하다. - Console 클래스: 콘솔 입력만 가능하며, 보안이 필요한 비밀번호 입력에 유용하다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BufferedReaderExample {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.print("이름을 입력하세요: ");
String name = reader.readLine();
System.out.println("이름: " + name);
}
}
결론
Java의 Scanner
는 입력을 받을 때 매우 유용하지만, 사용 후 반드시 닫아야 하며 nextInt()
와 nextLine()
을 함께 사용할 때 주의해야 한다. try-with-resources
를 활용하면 자동으로 리소스를 정리할 수 있으며, 파일 입력에도 효과적으로 사용할 수 있다. 필요에 따라 BufferedReader
와 같은 대안을 고려할 수도 있다.