Java 콘솔 입출력
목차
- 콘솔 입력
1-1. InputStream
1-2. InputStreamReader
1-3. BufferedReader
1-4. StringTokenizer
1-5. Scanner - 콘솔 출력
1. 콘솔 입력
1-1. InputStream
자바의 System.in을 이용하여 콘솔 입력을 얻을 수 있다. 코드를 통해 알아보자.
import java.io.InputStream; public class Test { public static void main(String[] args) throws Exception { InputStream in = System.in; int a; a = in.read(); System.out.println(a); } }
7번째 줄에서 알 수 있듯이 System.in은 InputStream의 객체이다.
InputStream의 read메소드는 사용자로부터 1byte의 입력을 받아들인다.
read메소드로 읽은 1byte의 데이터는 byte자료형으로 저장되는 것이 아니라 int자료형으로 저장된다. 저장되는 int값은 0-255 사이의 정수값으로 아스키 코드 값이다. 이 때, 개행을 기준으로 사용자의 입력이 전달된다.
여기서 0을 입력하면 0에 해당하는 아스키 코드 값인 48이 출력될 것이다.
한번에 1byte의 자료만 받을 수 있기 때문에 123을 입력해도 1에 해당하는 48이 출력된다. 총 3byte에 해당하는 데이터를 입력했지만 1byte만 읽을 수 있기 때문이다. 그렇다면 3byte를 다 읽고 싶다면 어떻게 해야할까. 코드로 알아보자.
import java.io.InputStream; public class Test { public static void main(String[] args) throws Exception { InputStream in = System.in; byte[] a = new byte[3]; in.read(a); System.out.println(a[0]); System.out.println(a[1]); System.out.println(a[2]); } }
하지만 여전히 읽어들인 값을 아스키 코드 값으로 해석해야하기에 불편하다. 그렇다면 입력한 값을 문자 그대로 출력할 수 있는 방식은 무엇이 있을까?
1-2. InputStreamReader
위에서 말한 불편한 점을 개선하기 위해 다음과 같이 코드를 변경했다.
import java.io.InputStream; import java.io.InputStreamReader; public class Test { public static void main(String[] args) throws Exception { InputStream in = System.in; InputStreamReader reader = new InputStreamReader(in); char[] a = new char[3]; reader.read(a); System.out.println(a); } }
InputStreamReader를 사용하기 위해 import 문이 하나 더 추가되었다. InputStreamReader 객체를 생성할 때는 9번째 줄과 같이 생성자의 입력으로 InputStream의 객체가 필요하다.
이전에는 읽어들일 값을 byte배열로 선언했는데 InputStreamReader를 이용하면 다음처럼 byte대신 char배열을 사용할 수 있게된다.
이제는 123을 입력할 경우 123이라는 값이 그대로 출력되는 것을 볼 수 있다.
다만 여전히 불편한 점이 있는데, 10번째 줄에서 처럼 지정해준 고정된 길이로만 입력을 받을 수 있다는 점이다.
이 불편함은 어떻게 해결할 수 있을까?
1-3. BufferedReader
위에서 느낀 불편함을 해결하기 위해 아래와 같이 코드를 변경해보았다.
import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; public class Test { public static void main(String[] args) throws Exception { InputStream in = System.in; InputStreamReader reader = new InputStreamReader(in); BufferedReader br = new BufferedReader(reader); String a = br.readLine(); System.out.println(a); } }
BufferedReader를 이용하기 위해 import 문이 추가되었다. BufferedReader는 11번째 줄과 같이 객체 생성시 생성자의 입력 값으로 InputStreamReader의 객체가 필요하다.
이제 BufferedReader의 readLine메소드를 이용하면 사용자가 엔터키를 입력할 때까지 입력했던 문자열 전부를 읽을 수 있게 된다.
간단하게 InputStream, InputStreamReader, BufferedReader를 정리해보겠다.
- InputStream : 1byte
- InputStreamReader : character
- BufferedReader : String
1-4. StringTokenizer
코딩테스트 문제에서 BufferedReader와 함께 자주 쓰이는 StringTokenizer에 대해 알아보자.
StringTokenizer 클래스는 특정 문자를 기준으로 문자열을 나누고 싶을 때 이용한다.
java.util.StringTokenizer를 import해주면 이용할 수 있다.
StringTokenizer의 생성자 종류
- StringTokenizer st = new StringTokenizer(문자열);
: 띄어쓰기를 기준으로 문자열을 분리한다.
- StringTokenizer st = new StringTokenizer(문자열, 구분자);
: 구분자를 기준으로 문자열을 분리한다.
- StringTokenizer st = new StringTokenizer(문자열, 구분자, true/false);
: 구분자도 분리된 문자열에 넣을 것인지(true), 구분자를 분리된 문자열에 넣지 않을지(false) 정한다. 디폴트는 false이다.
Stringtokenizer의 메소드

1-5. Scanner
Scanner 클래스를 이용하면 쉽게 콘솔 입력을 처리할 수 있다. 코드를 통해 살펴보자.
import java.util.Scanner; public class Test { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println(sc.next()); } }
Scanner 를 사용하기 위해서는 먼저 java.util.Scanner 클래스를 import 해야 한다.
Scanner 클래스는 생성자의 입력으로 System.in, 즉 콘솔 입력인 InputStream 을 필요로 한다.
Scanner클래스에는 단어 뿐만 아니라 숫자, 문자열등 다양하게 읽어 들일 수 있는 여러 메소드들이 있다.
- next() - 단어
-nextLine() - 라인
-nextInt() - 정수
2. 콘솔 출력
System.out.println()을 이용하면 쉽게 출력할 수 있다.
System.out은 PrintStream 클래스의 객체이다. PrintStream은 콘솔에 값을 출력할 때 사용되는 클래스이다. 보통 System.out.println은 콘솔에 문자열을 출력할 경우나 디버깅 시 많이 사용된다.
System.err라는 것도 있는데 System.out과 동일한 역할을 한다. 다만 System.err는 오류메시지를 출력할 경우에 사용하게 되어 있다.
'이론 > Java' 카테고리의 다른 글
final 키워드 헷갈리는 부분 정리 (0) | 2021.11.11 |
---|---|
java.lang 패키지 / 오토 박싱/ 오토 언박싱 (0) | 2021.07.28 |
Java Object 클래스 (0) | 2021.07.27 |
OOP - 상속 (0) | 2021.07.14 |
OOP - 클래스와 객체 (0) | 2021.07.13 |