전체 방문자
오늘
어제
모달조아
Better than yesterday
모달조아
  • 분류 전체보기 (147)
    • PS (86)
      • BOJ (79)
      • 프로그래머스 (6)
    • 이론 (41)
      • 자료구조 (2)
      • 알고리즘 (8)
      • 데이터베이스 (1)
      • 운영체제 (1)
      • 네트워크 (3)
      • 디자인패턴 (7)
      • Java (13)
      • Spring (4)
      • JPA (1)
      • Git (1)
    • 개발 (18)
    • 프로젝트 (1)
    • 기록 (0)
      • 후기 (0)
    • etc (1)

최근 글

티스토리

hELLO · Designed By 정상우.
모달조아
이론/Java

Java 콘솔 입출력(I/O)

이론/Java

Java 콘솔 입출력(I/O)

2021. 7. 14. 08:19

Java 콘솔 입출력

목차

  1. 콘솔 입력
    1-1. InputStream
    1-2. InputStreamReader
    1-3. BufferedReader
    1-4. StringTokenizer
    1-5. Scanner
  2. 콘솔 출력

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
  • Java 콘솔 입출력
  • 목차
  • 1. 콘솔 입력
  • 2. 콘솔 출력
'이론/Java' 카테고리의 다른 글
  • java.lang 패키지 / 오토 박싱/ 오토 언박싱
  • Java Object 클래스
  • OOP - 상속
  • OOP - 클래스와 객체
모달조아
모달조아

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.