[Java][I/O] 자바에서의 입출력

2022. 6. 22. 00:40JAVA/Language

1. 입출력이란 무엇인가?

입출력(Input/Output, I/O)이란 입력과 출력을 줄인 표현입니다. 입출력은 컴퓨터 내부 또는 외부의 장치와 프로그램간의 데이터를 주고받는 것을 말합니다. 예를들어 입력은 사용자에게 키보드로 데이터를 입력받거나 파일을 통해서 입력받을 수 있습니다. 출력은 모니터에 출력하거나 파일에 내용을 작성함으로써 예를 들 수 있습니다.

 

2. 스트림(stream)이란 무엇인가?

자바에서 입출력을 수행하려면, 즉 어느 한쪽에서 다른 쪽으로 데이터를 전달하려면, 두 대상을 연결하고 데이터를 전송할 수 있는 무언가가 필요합니다. 이것을 스트림이라고 정의합니다.

스트림이란 데이터를 운반하는데 사용되는 연결 통로

스트림은 단방향 통신만 가능하기 때문에 하나의 스트림으로 입력과 출력을 동시에 처리할 수 없습니다. 따라서 입력을 위한 입력 스트림(input stream)과 출력을 위한 출력 스트림(output straem), 모두 2개의 스트림이 필요합니다.

 

3. 바이트기반 스트림 - InputStream, OutputStream

입력스트림과 출력스트림의 종류

  • 위의 스트림 클래스들은 InputStream, OutputStream 추상 클래스의 자손들입니다.

InputStream과 OutputStream에 정의된 읽기와 쓰기를 수행하는 메서드

  • Inputstream.read() 메서드와 OutputStream.write(int b)는 입출력의 대상에 따라 읽고 쓰는 방법이 다르기 때문에 추상 메서드로 정의되어 있습니다.
  • read()와 write(int b)가 구현되어 있어야 다른 read, write 메서드도 사용할 수 있습니다. 이유는 다른 read, write 메서드내부에서 추상 메서드인 read(), write(int b)를 호출하기 때문입니다.

 

4. 보조 스트림

보조 스트림은 스트림의 기능을 보완하기 위해서 제공되는 클래스들입니다. 보조스트림은 실제 데이터를 주고 받는 스트림이 아니기 때문에 데이터를 입출력할 수 있는 기능은 없지만, 스트림의 기능을 향상시키거나 새로운 기능을 추가할 수 있습니다.

// 먼저 기반스트림을 생성
FileInputStream fis = new FileInputStream("test.txt");

// 기반스트림을 ㅇ리용해서 보조스트림을 생성
BufferedInputStream bis = new BufferedInputStream(fis);

bis.read(); // 보조스트림인 BufferedInputStream으로부터 데이터를 읽어옴

코드상으로는 보조 스트림인 BufferedInputStream이 입력기능을 수행하는 것처럼 보이지만, 실제 입력기능은 BufferedInputStream과 연결된 FileInputStream이 수행하고, 보조스트림인 BufferedInputStream은 버퍼만을 제공합니다.

 

보조스트림의 종류

 

5. 문자기반 스트림 - Reader, Writer

InputStream, OutputStream 클래스는 바이트기반 스트림입니다. 바이트 기반이라 함은 입출력 단위가 1byte라는 의미입니다. 하지만 C언어와 달리 Java에서는 한문자를 의미하는 char형이 1byte가 아닌 2byte이기 때문에 바이트 기반의 스트림으로 2byte인 문자를 처리하는 데는 어려움이 있습니다. 이 문제를 보완하기 위해서 문자기반의 스트림이 제공됩니다.

InputStream  -> Reader
OutputStream -> Writer

 

바이트기반 스트림과 문자기반 스트림의 비교

  • 문자기반 스트림의 대부분의 이름이 InputStream, OutputStream에서 Reader, Writer로 변경된 모습입니다.
  • ByteArrayInputStream에 대응하는 문자기반 스트림은 char 배열을 사용하는 CharArrayReader 스트림입니다.

 

바이트기반 스트림과 문자기반 스트림의 읽고 쓰는 메서드 비교

  • 문자 기반 스트림은 Reader 클래스와 Writer 클래스는 byte 배열 대신 char 배열을 사용함을 알 수 있음

바이트기반 보조스트림과 문자기반 보조스트림

References

[도서] Java의 정석, 남궁 성 지음