본문 바로가기

Java/Chapter 12. 콘솔 입력과 출력

[Java] 12.02 - 콘솔 입력(Console Input)

들어가며

 Scanner 클래스는 자바 5에서
소개되었다.

 그리고 이 클래스로 인해 키보드의
입력을 읽어 들이는 코드를 쉽게
구성할 수 있게 되었다.

 그 이전에는 이러한 일을 하는
코드의 구성이 간단하지 않았다.

 

Scanner 클래스

 키보드의 입력을 처리하는
코드에 상관없이,

 Scanner 클래스 자체를 이해할
필요가 있다.

 이 클래스가 속한 패키지는
java.util이다.

 그리고 이 클래스에 정의된
생성자 중 일부는 다음과 같다.

 실제로는 더 많은 생성자가
정의되어 있으나

 필요할 때마다 하나씩 알아가면
된다.

Scanner(File source)
Scanner(String source)
Scanner(InputStream source)

 Scanner 클래스는 생성자로
전달되는 대상으로부터

 데이터를 추출하는 기능을
제공한다.

 그리고 위의 생성자에서
보이는 바와 같이,

 Scanner 인스턴스는 파일이나
String 인스턴스 등

 다양한 대상으로부터의 데이터
추출이 가능하다.

 그런데 우리에게 익숙한 것은
String이니,

 String 인스턴스로부터 데이터를
추출하는 예를 보이겠다.

import java.util.Scanner;

class ScanningString{
    public static void main(String[] args){
        String source = "1 3 5";
        Scanner sc = new Scanner(source);   // Scanner 인스턴스 생성
        int num1 = sc.nextInt();    // int형 데이터 추출
        int num2 = sc.nextInt();    // int형 데이터 추출
        int num3 = sc.nextInt();    // int형 데이터 추출

        int sum = num1 + num2 + num3;
        System.out.printf("%d + %d + %d = %d", num1, num2, num3, sum);
    }
}

/*
실행 결과
1 + 3 + 5 = 9
*/

 위 예제의 다음 문장은,

 Scanner 인스턴스와 인자로
전달된 source와의 연결로
이어진다.

Scanner sc = new Scanner(source);

 그래서 참조변수 sc를 통해
데이터를 추출하면

 Scanner가 참조하는 대상으로부터
데이터가 추출이 된다.

 그런데 윙 예제에서 source는
문자열이었다.

 그러나 그 대상이 문자열이
아니더라도

 데이터를 추출하는 방법은
달라지지 않는다.

 

Scanner 클래스의 키보드 적용

 앞서 보인 예제를 수정하여
Scanner 인스턴스를 키보드와
연결하고자 한다.

 이를 위해 달라지는 부분은
다음 문장이 유일하다.

Scanner sc = new Scanner(System.in);
//Scanner sc = new Scanner(source);

 Scanner의 생성자로 전달된
System.in은 키보드를 의미한다.

 정확히는 키보드를 의미하는
인스턴스의 참조변수이다.

import java.util.Scanner;

class ScanningKeyboard{
    public static void main(String[] args){
        String source = "1 3 5";
        Scanner sc = new Scanner(System.in);   // Scanner 인스턴스 생성
        int num1 = sc.nextInt();    // int형 데이터 추출
        int num2 = sc.nextInt();    // int형 데이터 추출
        int num3 = sc.nextInt();    // int형 데이터 추출

        int sum = num1 + num2 + num3;
        System.out.printf("%d + %d + %d = %d", num1, num2, num3, sum);
    }
}

/*
실행 결과
12
24
36
12 + 24 + 36 = 72
*/

 실행과정에서 nextInt 메소드가
호출되면

 키보드로부터 데이터가 입력될
때까지 프로그램의 실행이 대기
상태에 놓인다.

 그리고 정수를 입력한 다음에
Enter를 눌러서 키보드의 입력이
끝이 났음을 알리면

 입력된 정수를 읽어 들이고 또
실행을 이어 나간다.

 

Scanner 클래스의 주요 메소드들

 예제에서는 int형 데이터의 추출
방법만 보였지만

 Scanner 클래스에는 다양한
종류의 데이터를 추출할 수
있도록

 메소드가 정의되어 있다.

 그리고 그 일부는 다음과 같다.

int nextInt()
byte nextByte()
String nextString()
double nextDouble()
boolean nextBoolean()

 이름만 보아도 어떠한 데이터의
추출을 위한 메소드인지 파악할
수 있다.

 따라서 다음 예제를 통해
문자열의 추출을 위한

nextLine 메소드의 호출 관련
코드만 보이고자 한다.

import java.util.Scanner;

class ReadString{
    public static void main(String[] args){
       Scanner sc = new Scanner(System.in);

       System.out.print("문자열 입력: ");
       String str1 = sc.nextLine();

       System.out.print("문자열 입력: ");
       String str2 = sc.nextLine();

       System.out.printf("입력된 문자열 1: %s\n", str1);
       System.out.printf("입력된 문자열 2: %s\n", str2);
    }
}

/*
실행 결과
문자열 입력: i have to make a reason
문자열 입력: about night with a fears
입력된 문자열 1: i have to make a reason
입력된 문자열 2: about night with a fears
*/

 끝으로 nextByte, nextInt는
둘 다 정수의 입력을 위한
메소드들이다.

 그러나 입력된 정수의 반환형에
차이가 있다.

 예를 들어서 키보드로부터
8이 입력되고,

 이를 nextByte로 읽으면
8이 byte형으로 반환되고,

 nextInt로 읽으면 8이
int형으로 반환된다.


참고 및 출처

윤성우의 열혈 Java 프로그래밍
국내도서
저자 : 윤성우
출판 : 오렌지미디어 2017.07.05
상세보기