Java 프로그래밍에서 사용자의 입력을 받아야 하는 경우는 매우 흔합니다. 이번 글에서는 Java 콘솔(표준 입력)에서 데이터를 읽어오는 대표적인 두 가지 방법, Scanner 클래스와 BufferedReader 클래스를 예제와 함께 자세히 살펴보겠습니다.
1. Scanner 클래스를 사용한 콘솔 입력
Scanner는 다양한 타입(문자열, 정수, 실수 등)의 입력을 손쉽게 읽을 수 있도록 지원하는 가장 널리 사용되는 클래스입니다.
예제 코드
import java.util.Scanner;
public class Demo{
public static void main(String args[]){
Scanner my_scan = new Scanner(System.in);
String my_str = my_scan.nextLine();
System.out.println("입력된 문자열은 " + my_str);
int my_val = my_scan.nextInt();
System.out.println("입력된 정수는 " + my_val);
float my_float = my_scan.nextFloat();
System.out.println("입력된 실수 값은 " + my_float);
}
}실행 결과
입력된 문자열은 Joe 입력된 정수는 56 입력된 실수 값은 78.99
코드 설명
위 예제에서 Demo라는 클래스가 main 함수를 포함하고 있습니다. 먼저 Scanner 클래스의 인스턴스를 생성하며, 생성자에 System.in을 전달해 표준 입력 스트림과 연결합니다.
이후 각 메서드의 역할은 다음과 같습니다.
- nextLine(): 문자열 입력을 한 줄 단위로 읽어옵니다.
- nextInt(): 표준 입력 콘솔에서 정수형 값을 읽어옵니다.
- nextFloat(): 표준 입력 콘솔에서 실수(float) 타입의 값을 읽어옵니다.
읽어들인 값들은 System.out.println()을 통해 콘솔에 출력됩니다. Scanner는 이처럼 타입별 전용 메서드를 제공하기 때문에 초보자도 직관적으로 사용할 수 있다는 장점이 있습니다.
2. BufferedReader를 사용한 콘솔 입력
BufferedReader는 문자 기반 스트림을 버퍼링하여 효율적으로 읽어오는 클래스입니다. 대량의 데이터를 처리할 때 Scanner보다 성능이 뛰어난 것으로 알려져 있습니다.
예제 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Demo{
public static void main(String[] args) throws IOException{
BufferedReader my_reader = new BufferedReader(new InputStreamReader(System.in));
String my_name = my_reader.readLine();
System.out.println("입력된 이름은 ");
System.out.println(my_name);
}
}실행 결과
입력된 이름은 Joe
코드 설명
이 예제 역시 Demo 클래스의 main 함수에서 동작합니다. InputStreamReader로 바이트 스트림을 문자 스트림으로 변환한 뒤, 이를 BufferedReader로 감싸 버퍼링 기능을 추가합니다.
readLine() 메서드를 호출하면 표준 입력으로 들어온 문자열 데이터를 한 줄씩 읽어올 수 있습니다. 주의할 점은 readLine()이 IOException을 던질 수 있으므로, 위 예제처럼 main 메서드에 throws IOException을 선언하거나 try-catch 블록으로 예외를 처리해야 한다는 것입니다.
Scanner vs BufferedReader, 무엇을 선택해야 할까?
| 구분 | Scanner | BufferedReader |
|---|---|---|
| 사용 편의성 | 간편함 (타입별 메서드 제공) | 문자열만 반환 (파싱 필요) |
| 성능 | 상대적으로 느림 | 빠름 (버퍼링 지원) |
| 예외 처리 | 필요 없음 | IOException 처리 필수 |
| 적합한 경우 | 간단한 입력, 학습용 | 대용량 데이터, 성능 중시 |
정리하면, 간단한 프로그램이나 학습 목적이라면 Scanner가 편리하고, 입출력 성능이 중요한 대규모 애플리케이션에서는 BufferedReader가 더 적합합니다. 두 방식의 특징을 잘 이해하고 상황에 맞게 활용하시기 바랍니다.