1. 콘솔에서 읽기, System.in
이전 강의에서 화면에 출력하는 방법을 배웠습니다. 이를 위해 System.out 객체와 그 메서드 print(), println()을 사용했죠. 간단하고 편리합니다.
하지만 짐작하듯이, 출력만으로는 충분하지 않습니다. 대부분의 프로그램의 목표는 사용자에게 유용한 일을 하는 것입니다. 그래서 사용자가 키보드로 데이터를 입력할 수 있어야 할 때가 매우 많습니다.
출력과 마찬가지로 입력에도 전용 객체 — System.in — 이 있습니다. 하지만 기대만큼 편리하지는 않습니다. 이 객체는 키보드에서 데이터를 읽을 수 있지만, 한 번에 한 문자씩만 읽습니다.
따라서 우리는 System.in과 함께 사용하면 필요한 기능을 모두 제공하는 또 다른 클래스를 활용하겠습니다. Java에는 거의 모든 경우를 위한 클래스가 오래전부터 준비되어 있습니다. 지금 그중 하나를 알아보겠습니다.
2. 클래스 Scanner
Scanner 클래스(완전한 이름은 java.util.Scanner)는 콘솔, 파일, 인터넷 등 다양한 소스에서 데이터를 읽을 수 있습니다. 키보드에서 데이터를 읽게 하려면 데이터 소스로 System.in 객체를 매개변수로 전달해야 합니다. 그러면 Scanner 타입의 객체가 알아서 처리합니다.
Scanner 객체로 키보드에서 입력을 읽는 코드는 대략 다음과 같습니다:
| 코드 | 설명 |
|---|---|
|
Scanner 객체를 생성합니다. 키보드에서 문자열을 읽습니다. 키보드에서 숫자를 읽습니다. |
보기에는 간단해 보이지만, 정말 그렇게 쉬울까요?
아마 궁금한 점이 많을 텐데, 지금부터 차례로 답해 보겠습니다.
그전에 Scanner 클래스를 사용하는 전체 프로그램 예제를 먼저 보겠습니다:
void main()
{
Scanner console = new Scanner(System.in);
String name = console.nextLine();
int age = console.nextInt();
System.out.println("Name: " + name);
System.out.println("Age: " + age);
}
3. 객체 Scanner 생성
첫 번째 질문 — Scanner console = new Scanner(System.in); 이 줄은 무엇일까요?
이런 형태의 코드는 헷갈릴 수 있지만, 앞으로 계속 보게 됩니다. 이제 이 코드가 무엇을 의미하는지 설명할 때입니다.
텍스트를 담는 변수를 보통 어떻게 만드는지 떠올려 봅시다:
String str = "텍스트";
먼저 변수의 타입(String)을 쓰고, 그다음 이름(str)을 쓰며, 마지막으로 등호 뒤에 값을 작성합니다.
문제로 보였던 그 줄도 사실 똑같습니다:
Scanner console = new Scanner(System.in);
등호의 왼쪽은 Scanner 타입의 변수 console을 선언한 것입니다. 이름은 예를 들어 s, scanner, 또는 keyboard로 해도 됩니다. 그러면 코드는 다음과 같습니다:
Scanner s = new Scanner(System.in);
String name = s.nextLine();
int age = s.nextInt();
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int age = scanner.nextInt();
Scanner keyboard = new Scanner(System.in);
String name = keyboard.nextLine();
int age = keyboard.nextInt();
이제 훨씬 명확해졌을 것입니다.
반면 등호 오른쪽의 코드는 조금 더 복잡해 보입니다. 즉, new Scanner(System.in); 를 말합니다. 그래도 그리 어려운 것은 아닙니다.
이 코드는 JVM에 이렇게 지시합니다: new 키워드로 Scanner 타입의 새 객체를 만들고, 새로 만든 Scanner 객체가 데이터를 읽어 올 소스로 System.in 객체를 매개변수로 전달하라.
이 줄이 실행되고 나면 Scanner 타입의 변수 console이 생기며, 프로그램은 이를 통해 키보드 입력을 읽을 수 있게 됩니다.
4. 메서드 호출
위 예제에서 Scanner 타입의 변수 console은 Scanner 객체에 대한 참조를 담고 있습니다.
변수가 가리키는 객체의 메서드를 호출하려면, 변수 이름 뒤에 점을 찍고 메서드 이름과 매개변수를 씁니다. 일반적인 형태는 다음과 같습니다:
variable.method(parameters);
예시:
System.out.println("안녕");
System.out.println(1);
함수에 매개변수를 전달하지 않을 경우, 빈 괄호만 쓰면 됩니다:
variable.method();
예시:
System.out.println();
5. 콘솔에서 데이터 입력
Scanner 타입의 객체가 있으면 키보드로부터 데이터를 입력받는 일은 매우 쉽습니다.
키보드에서 문자열을 읽으려면 다음 명령이 필요합니다:
String str = console.nextLine();
프로그램이 이 줄에 도달하면 일시 정지하고, 사용자가 데이터를 입력한 뒤 Enter 키를 누를 때까지 기다립니다. 그러고 나면 입력한 내용이 변수 str에 저장됩니다.
키보드에서 정수를 읽으려면 다음 명령이 필요합니다:
int number = console.nextInt();
동작은 앞의 명령과 동일합니다. 프로그램이 이 줄에 도달하면 일시 정지하고, 사용자가 Enter 키를 누를 때까지 기다립니다. 이후 입력한 내용이 숫자로 변환되어 변수 number에 저장됩니다.
사용자가 정수로 변환할 수 없는 값을 입력하면, 프로그램은 오류를 발생시키고 종료됩니다.
키보드에서 실수(소수)를 읽으려면 다음 명령이 필요합니다:
double number = console.nextDouble();
이 명령은 nextInt()와 완전히 동일하게 동작하지만, 입력값이 double로 변환 가능한지 확인합니다.
키보드에서 두 수를 읽어 합을 출력하는 프로그램 예시:
void main()
{
Scanner console = new Scanner(System.in);
int a = console.nextInt();
int b = console.nextInt();
System.out.println(a + b);
}
참고
사용자는 한 줄에 여러 숫자를 공백으로 구분해 입력할 수 있으며, 이런 경우도 Scanner 클래스의 메서드들이 올바르게 처리합니다. 다만, 프로그램은 사용자가 Enter 키를 누른 이후에야 값을 읽습니다.
GO TO FULL VERSION