본문 바로가기
JAVA

[JAVA] 콘솔 입력 방법 (Scanner, InputStream, InputStreamReader, BufferedReader)

by 펄블리네 2023. 7. 13.

Java 콘솔게임의 가장 기본이 되는 '콘솔에 무언가를 입력하는 방법'을 정리해보았습니다.


콘솔(console)이란?

  • 컴퓨터 용어 : 디스플레이 모니터와 키보드(또는 입력이 가능한 다른 장치)가 조합된 장치
  • 점프 투 자바 : 사용자의 입력을 받거나 사용자에게 문자열을 출력해 주는 역할을 하는 것을 통칭

프로그램에서 사용자에게 문자열을 보여주는 것이 콘솔 출력, 사용자가 답변을 입력하는 것을 콘솔 입력이라 합니다.

아래에는 첫 문장에서 설명했던 대로 콘솔 입력을 하는 여러가지 방법들에 대해 정리했습니다.

 

1. InputStream

1byte의 사용자 입력을 받아들여 아스키 코드값으로 저장

import java.io.IOException;
import java.io.InputStream;

public class Sample {
    public static void main(String[] args) throws IOException {
        InputStream in = System.in;

        int a = in.read();

        System.out.println(a);
    }
}
  • System.in : 콘솔 입력하는 InputStream의 객체
  • read() : 입력된 값을 저장하는 InputStream의 메서드

InputStream으로 1byte 이상의 값을 한꺼번에 전달받으려면

InputStream in = System.in;

byte[] a = new byte[5];
in.read(a);

System.out.println(a[0]);
System.out.println(a[1]);
System.out.println(a[2]);
System.out.println(a[3]);
System.out.println(a[4]);

byte 배열에 담아서 출력

 

∴ 아스키코드로 값이 저장, 1byte씩만 전달 받을 수 있음(그 이상은 배열 형태로는 가능) ☞ 매우매우 번거로움

 

2. InputStreamReader

바이트 대신 문자로 입력 스트림을 읽음

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Sample {
    public static void main(String[] args) throws IOException {
        InputStream in = System.in;
        InputStreamReader reader = new InputStreamReader(in);
        // InputStreamReader reader = new InputStreamReader(System.in) 으로 축약 가능
        
        char[] a = new char[5];
        reader.read(a);

        System.out.println(a);
    }
}

byte 대신 char 배열에 담아 1byte이상 문자 그대로 읽을 수 있다.

 

but!!! 배열에 담는 다는 건 입력할 값의 크기를 미리 예측해야한다는 말...(고정된 길이만 가능)

 

3. BufferedReader

사용자가 엔터키를 입력할 때까지의 사용자 입력을 전부 받아들임

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Sample {
    public static void main(String[] args) throws IOException {
        InputStream in = System.in;
        InputStreamReader reader = new InputStreamReader(in);
        BufferedReader br = new BufferedReader(reader);
        // BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 으로 축약 가능

        String a = br.readLine();
        System.out.println(a);
    }
}
  • InputStream의 System.in 객체로 1byte씩 아스키코드로 전달 ☞ InputStreamReader로 문자로 ☞ BufferedReader로 문자열로
  • readLine() : String 값으로 개행문자(엔터값)를 포함해 한줄을 전부 읽어오는 메서드
더보기
  • InputStream : byte
  • InputStreamReader : character
  • BufferedReader : String

 

4. Scanner

콘솔 입력을 보다 쉽게 처리할 수 있어 가장 많이 사용

import java.util.Scanner;

public class Sample {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        System.out.println(sc.next());
    }
}

주로 사용하는 토큰 관련 Scanner의 메서드

  • next() : 개행문자를 무시하고 문자열을 입력을 받음
  • nextLine() : 개행문자(엔터키)를 포함하는 한 라인을 읽고 개행문자를 버린 나머지만 리턴(BufferedReader의 readLine()과 유사)
  • nextInt() : 정수

이 외에도 다양한 메서드가 존재하나 생략

 

next() vs nextLine()

import java.util.Scanner;
 
public class Sample {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
 
        int num;
        String str;
        
        System.out.println("숫자 입력");
        num = sc.nextInt();
 
        System.out.println("문자 입력");
        str = sc.nextLine();
 
        System.out.println("숫자 : " + num);
        System.out.println("문자 : " + str);
        
        sc.close();
    }
}

그러면


숫자 입력  5

문자 입력 

 

숫자 : 5

문자 :


숫자 입력을 하고 엔터를 치면 문자를 입력하지 못하고 출력된다.

왜냐하면 next와 nextInt는 개행문자를 무시하고 입력을 받는 반면 nextLine은 개행문자를 포함한 한줄 단위로 입력을 받기 때문이다.

 

위처럼 5을 입력하고 엔터를 쳤다면 버퍼에 5\n이 존재 ☞ 이때 nextInt가 버퍼의 내용을 가져올 때 \n를 제외한 5만 가져옴

☞ nextLine은 공백문자, 개행문자를 포함시키기 때문에 남은 \n만 가져오고 종료

 

import java.util.Scanner;
 
public class Sample {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
 
        int num;
        String str;
        
        System.out.println("숫자 입력");
        num = sc.nextInt();
 
        System.out.println("문자 입력");
        str = sc.next();
 
        System.out.println("숫자 : " + num);
        System.out.println("문자 : " + str);
        
        sc.close();
    }
}

위와 같이 nextLine을 next로 변경하면


숫자 입력  5

문자 입력 abc

 

숫자 : 5

문자 : abc


next는 \n을 무시하기 때문에 올바르게 입력받아 출력할 수 있다.

 

 

더보기

참고 문서 

점프 투 자바

https://devlog-wjdrbs96.tistory.com/80

반응형

댓글