멀티캠퍼스

[2026.04.28] TIL - 22일차 입출력

buckwheat 2026. 4. 28. 17:34

 

1. 입출력(IO)

IO는 Input과 Output의 약자로, 프로그램과 외부 장치 사이에서 데이터를 주고받는 것을 말한다. 예를 들어 키보드에서 값을 입력받거나, 모니터에 결과를 출력하거나, 파일에 내용을 저장하는 작업이 모두 입출력에 해당한다.

컴퓨터 내부와 외부 장치 사이에서 데이터를 주고받으려면 공통적인 처리 방식이 필요한데, 자바에서는 이를 위해 스트림(Stream)이라는 개념을 사용한다.

 

2. 스트림(Stream)

스트림은 입출력 장치와 프로그램 사이에서 데이터를 읽고 쓰기 위해 자바가 제공하는 통로이다. 모든 스트림은 단방향으로 동작하므로, 입력과 출력을 동시에 하려면 각각 별도의 스트림이 필요하다.

예를 들어 키보드에서 프로그램으로 데이터를 가져오는 것은 입력 스트림이고, 프로그램에서 모니터나 파일로 데이터를 내보내는 것은 출력 스트림이다.

 

3. 스트림의 분류

스트림은 크게 바이트 기반 스트림문자 기반 스트림으로 나눌 수 있다.

 

바이트 기반 스트림은 데이터를 1바이트 단위로 처리한다. 그림, 오디오, 비디오, 텍스트 파일처럼 모든 종류의 데이터를 다룰 수 있다. 이때 입력 스트림의 최상위 클래스는 InputStream이고, 출력 스트림의 최상위 클래스는 OutputStream이다.

 

문자 기반 스트림은 데이터를 문자 단위로 처리한다. 주로 텍스트 파일처럼 문자 중심의 데이터를 다룰 때 사용한다.

이때 입력 스트림의 최상위 클래스는 Reader이고, 출력 스트림의 최상위 클래스는 Writer이다.

정리하면 바이트 기반은 모든 파일 처리에 사용할 수 있고, 문자 기반은 주로 텍스트 처리에 적합하다.

 

4. InputStream과 OutputStream

InputStream은 바이트 기반 입력 스트림의 최상위 클래스이다. 파일이나 장치로부터 데이터를 읽어올 때 사용한다. 대표적으로 read() 메소드를 통해 데이터를 읽고, close()로 스트림을 닫는다.

OutputStream은 바이트 기반 출력 스트림의 최상위 클래스이다. 데이터를 파일이나 장치로 내보낼 때 사용한다. write() 메소드로 데이터를 출력하고, flush()로 버퍼를 비우며, close()로 스트림을 닫는다.

즉, InputStream은 읽기, OutputStream은 쓰기라고 생각하면 된다.

 

5. Reader와 Writer

Reader는 문자 기반 입력 스트림의 최상위 클래스이다. 텍스트 파일처럼 문자 단위로 읽어야 하는 경우 사용한다.

Writer는 문자 기반 출력 스트림의 최상위 클래스이다. 문자열이나 문자 데이터를 파일에 저장할 때 사용한다.

 

Reader와 Writer는 바이트가 아니라 문자 단위로 처리하기 때문에, 텍스트 데이터를 다룰 때 더 자연스럽고 편리하다.

 

6. File 클래스

File 클래스는 파일이나 디렉토리를 표현하는 클래스이다. 파일의 이름, 경로, 크기, 수정 날짜 같은 정보를 확인할 수 있고, 파일이나 디렉토리를 생성하거나 삭제하는 기능도 제공한다.

예를 들어 File 객체를 만들면 특정 경로의 파일을 가리킬 수 있고, 그 파일이 실제로 존재하는지, 디렉토리인지 파일인지, 크기는 얼마인지 등을 확인할 수 있다.

또한 createNewFile()로 새 파일을 만들거나, mkdir(), mkdirs()로 디렉토리를 만들 수 있고, delete()로 삭제할 수도 있다.

즉, File 클래스는 파일 자체의 내용을 읽고 쓰는 클래스라기보다 파일과 디렉토리의 정보를 관리하는 클래스라고 볼 수 있다.

 

7. FileInputStream과 FileOutputStream

FileInputStream은 파일로부터 바이트 단위로 읽을 때 사용하는 클래스이다. 그림, 오디오, 비디오, 텍스트 파일 등 모든 종류의 파일을 읽을 수 있다. 파일이 존재하지 않으면 예외가 발생하기 때문에 예외처리가 필요하다.

FileOutputStream은 파일에 바이트 단위로 저장할 때 사용하는 클래스이다. 역시 모든 종류의 데이터를 저장할 수 있다. 파일이 없으면 자동으로 생성되지만, 이미 파일이 존재하면 기본적으로 덮어쓴다. 만약 기존 파일 뒤에 이어서 작성하고 싶다면 append 옵션을 true로 설정해야 한다.

정리하면 FileInputStream은 파일 읽기, FileOutputStream은 파일 쓰기에 사용되는 바이트 기반 파일 스트림이다.

 

8. FileReader와 FileWriter

FileReader는 텍스트 파일을 문자 단위로 읽을 때 사용하는 클래스이다. 문자 기반 스트림이기 때문에 텍스트 파일 처리에 적합하다. 하지만 이미지나 오디오 같은 바이너리 파일은 읽을 수 없다.

FileWriter는 텍스트 파일을 문자 단위로 저장할 때 사용하는 클래스이다. 파일이 없으면 생성되지만, 이미 있으면 기본적으로 덮어쓴다. 기존 내용 뒤에 이어서 쓰고 싶다면 append 옵션을 true로 설정해야 한다.

정리하면 FileReader와 FileWriter는 텍스트 파일 전용 문자 기반 파일 스트림이라고 이해하면 된다.

 

9. 보조 스트림

보조 스트림은 기존 스트림의 기능을 향상시키거나 새로운 기능을 추가하기 위해 사용하는 스트림이다. 보조 스트림은 혼자서 입출력을 처리할 수 없고, 반드시 기반 스트림과 함께 사용해야 한다.

예를 들어 FileInputStream 같은 기반 스트림을 먼저 만들고, 그 위에 BufferedInputStream 같은 보조 스트림을 연결해서 사용하는 방식이다.

보조 스트림은 문자 변환, 성능 향상, 기본 자료형 처리, 객체 입출력 같은 다양한 기능을 제공한다.

 

10. 성능 향상 보조 스트림

BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter 같은 클래스는 입출력 성능을 높이기 위한 보조 스트림이다.

이 클래스들은 데이터를 한 번에 조금씩 처리하지 않고, 버퍼에 모아 두었다가 한꺼번에 읽거나 쓰는 방식으로 동작한다. 그래서 입출력 횟수를 줄일 수 있고, 전체적인 처리 속도가 더 좋아진다.

즉, 파일이나 장치와 직접 자주 통신하기보다 중간 버퍼를 사용해 효율적으로 처리하는 방식이다.

 

11. 문자 변환 보조 스트림

InputStreamReader와 OutputStreamWriter는 바이트 기반 스트림과 문자 기반 스트림을 연결해 주는 보조 스트림이다.

예를 들어 바이트 단위 입력을 문자 단위로 바꾸거나, 문자 데이터를 바이트 형태로 바꿔서 출력할 수 있다. 이런 클래스는 바이트와 문자를 함께 다뤄야 하는 상황에서 자주 사용된다.

 

12. 정리

입출력은 프로그램과 외부 장치 사이에서 데이터를 주고받는 작업이다. 자바에서는 이를 위해 스트림을 사용하며, 스트림은 입력용과 출력용, 바이트 기반과 문자 기반으로 나뉜다.

InputStream과 OutputStream은 바이트 기반 스트림의 기본이 되고, Reader와 Writer는 문자 기반 스트림의 기본이 된다. File 클래스는 파일과 디렉토리 정보를 다루고, FileInputStream, FileOutputStream, FileReader, FileWriter는 실제 파일 입출력에 사용된다. 여기에 보조 스트림을 함께 사용하면 성능을 높이거나 기능을 확장할 수 있다.

정리하면 IO는 프로그램에서 파일, 키보드, 모니터 같은 외부 장치와 데이터를 주고받기 위한 중요한 기능이며, 자바에서는 스트림을 중심으로 그 구조를 이해하는 것이 핵심이다.