Java Scanner 사용법과 닫는 방법

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를 파일 입력에 사용할 때 주의할 점은?

  • 파일이 존재하는지 먼저 확인해야 한다.
  • ScannerFileNotFoundException을 발생시킬 수 있으므로 예외 처리가 필요하다.
  • 읽기가 끝나면 반드시 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와 같은 대안을 고려할 수도 있다.