2 minute read

목표

자바의 Input과 Output에 대해 학습하세요.

학습할 것 (필수)

스트림 (Stream) / 버퍼 (Buffer) / 채널 (Channel) 기반의 I/O

프로그램에서 사용된 데이터를 영구적으로 저장하여 후에 다른 프로그램에서 사용하게 하기 위해 필요한 기능이 입출력 기능이다. 즉 프로그램에서 생성된 데이터를 파일 형태로 컴퓨터의 하드디스크나 보조 기억장치에 저장한 다음 다른 프로그램에서 이 데이터를 읽어서 사용하는 기능이다.

자바는 입출력을 위해 스트림(Stream)을 사용한다.

Stream: 단방향인 순서가 있는 일련의 데이터를 의미, 시냇물이라는 뜻이지만, 프로그래밍에서의 의미는 데이터의 흐름을 말한다.

스트림 방향

  • 입력 스트림(Input Stream): 프로그램으로 들어오는 스트림
  • 출력 스트림(Output Stream): 프로그램에서 밖으로 나가는 스트림

데이터 형태

  • 문자 스트림(Charater Stream): 사람이 이해할 수 있는 문자로 구성 된 스트림
  • 바이트 스트림(Byte Stream): 사람이 보아서 알 수 없지만 프로그램에서 사용할 수 있는 데이터로 구성된 스트림

입출력을 위해 스트림을 생성하고 다루는 클래스들은 java.io 패키지에 있다.

FileInputStream: 파일로부터 입력되는 스트림을 처리하는 클래스, 바이트 스트림 처리(1Byte)
FileOutputStream: 파일로 스트림을 출력하는 클래스, 바이트 스트림 처리

FileReader: 파일로부터 문자 스트림을 입력받는 클래스, 문자 스트림 처리(2Bytes)
FileWriter: 파일로 문자 스트림을 출력하는 클래스, 문자 스트림 처리

Buffer: 필요한 데이터를 미리 한꺼번에 읽어 두거나, 출력할 데이터를 모아두었다가 한꺼번에 출력하는 개념

Channel: 양방향, input/ouput 구분하지 않으며, ByteChannel, FileChannel을 만들어서 읽고 쓸 수 있다.

InputStream과 OutputStream

OuputStream 클래스에는 바이트 스트림을 출력하는 메소드들을 제공하고 있다. InputStream 클래스는 입력(키보드, 파일 등)으로부터 데이터를 읽어오는 메소드를 제공하고 있다. 시스템의 표준입력인 System.in이 InputStream 클래스의 객체를 의미한다.

FileOutputStream 클래스와 FileInputStream 클래스 파일에 바이트 스트림을 출력하고, 바이트 스트림 파일을 읽는 기능을 제공한다. FileOutputStream 클래스는 OuputStream 클래스로부터 상속된 클래스이다. 이 클래스는 파일에 바이트 스트림을 출력할 수 있는 기능을 제공한다.

FileInputStream 클래스는 InputStream 클래스로부터 상속된 클래스로서 파일로부터 입력 받을 수 있는 기능을 제공한다.

Byte와 Character 스트림

입력 스트림 - 키보드, 파일, 메모리 버퍼, 포트(port) 등으로부터 입력되는 데이터의 일관된 표현
출력 스트림 - 모니터, 파일, 메모리 버퍼, 포트 등에 출력하는 데이터의 일관된 표현

스트림에는 문자(Character) 스트림과 바이트(Byte) 스트림 두가지 형태가 있다.
문자 스트림: 16비트 문자나 문자열들을 읽고 쓰기 위한 스트림, Reader, Writer 클래스와 그 하위 클래스를 이용
바이트 스트림(바이너리 스트림): 8비트의 바이트를 읽고 쓰기 위한 스트림, InputStream, OutputStream 클래스와 그 하위 클래스를 이용

표준 스트림 (System.in, System.out, System.err)

System.out.println 의 System 은 JDK 라이브러리에 있는 클래스 이름이고, out은 이 클래스에 속하는 필드 이름이다.

표준 입출력: 키보드로부터의 입력과 모니터로의 출력 기능

System 클래스는 java.lang 패키지에 속하며, 클래스의 필드와 메소드들은 모두 정적 필드와 정적 메소드로 선언되어 있다. 그래서 System 클래스는 객체를 만들지 않고 사용한다.

데스크탑에서 작동하는 많은 프로그램은 키보드로부터 입력받고 모니터로 출력하는 기능을 기본적으로 필요로 한다. 그래서 이런 입력과 출력을 각각 표준 입력(Standard input), 표준 출력(Standard output)이라고 부른다.

자바에서 표준 입력과 표준 출력을 하기 위해서는 System 클래스의 in 필드와 out 필드를 사용해야 한다.

  • System.in 키보드로부터 입력을 받는 방법

System 클래스의 in 필드는 표준 입력, 즉 키보드로부터 입력을 받는데 사용되는 필드이며 InputStream 클래스 타입으로 선언되어 있다. 그런데 InputStream 클래스는 문자 스트림이 아니라 바이트 스트림을 입력받는 클래스이다. 그렇기 때문에 이 클래스의 메소드를 이용해서는 한글 입력을 제대로 받을 수 없다. 그래서 in 필드는 바이트 스트림을 문자 스트림으로 바꾸는 기능을 갖는 InputStreamReader 클래스와 함께 사용해야 한다.

  • System.out 모니터로 출력을 하는 방법

System 클래스에 있는 out 필드는 표준 출력을 하는데 사용되는 필드이다. PrintStream 클래스 타입으로 선언되어 있다. 그렇기 때문에 PrintStream 클래스의 println, print, printf 메소드를 사용할 수 있다.

  • System.err

System 클래스에 out 필드와 같이 PrintStream 타입으로 err라는 필드가 있다. 표준 에러 출력에 사용되는 필드이며, 에러 메시지를 모니터로 보내는 출력이다.

파일 읽고 쓰기

FileInputStream: 파일로부터 입력되는 스트림을 처리하는 클래스, 바이트 스트림 처리 FileOutputStream: 파일로 스트림을 출력하는 클래스, 바이스 스트림 처리

FileReader: 파일로부터 문자 스트림을 입력받는 클래스, 문자 스트림 처리 FileWriter: 파일로 문자 스트림을 출력하는 클래스, 문자 스트림 처리


참고 서적

알기 쉽게 해설한 Java 김충석 저
뇌를 자극하는 Java 프로그래밍 김윤명 저
열혈강의 객체 중심 Java 강요천 저


live-study with whiteship