본문 바로가기

카테고리 없음

[Java] 11. IO

입출력

IO는 Input과 Output의 약자로 컴퓨터 내외부 장치와 프로그램 간의 데이터를 주고 받는 것을 말한다.

장치와 입출력을 하기위해서는 하드웨어 장치에 직접 접근이 필요한데 다양한 매체에 존재하는

데이터들을 사용하기 위해 입출력 데이터를 처리할 공통적인 방법으로 스트림을 사용한다.

 

스트림

입출력 장치에서 데이터를 읽고 쓰기 위해서 자바에서 제공하는 클래스이다.

스트림은 전부 단방향이며 이로인해 동시에 입출력을 수행하려면 2개의 스트림이 필요하다.

바이트 단위를 처리하는 바이트 기반의 최상위 클래스는 InputStream(입력), OutputStream(출력)

문자 단위를 처리하는 문자 기반의 최상위 클래스는 Reader(입력), Writer(출력)이다.

 

File 클래스

파일 시스템의 파일을 표현하는 클래스이다.

파일의 크기, 속성, 이름 등 정보와 파일 생성이나 삭제 기능을 제공한다.

 

FileInputStream은 파일을 바이트 단위로 읽을 때 사용하고 모든 종류의 파일을 읽을 수 있다.

InputStream의 하위 클래스로 사용 방법이 동일하다.

FileOutputStream은 파일에 바이트 단위로 저장할 때 사용하고 마찬가지로 모든 종류의 데이터를

파일로 저장할 수 있다. OutputStream과 사용 방법은 동일하다.

 

FileReader는 텍스트 파일로부터 문자 단위로 읽을 때 사용하고 텍스트 파일만 가능하다.

FileWriter은 텍스트 파일로부터 문자 단위로 저장할 때 사용한다. 이것도 텍스트 파일만 가능하다.

각각 상위 조상인 Reader, Writer와 사용 방법이 동일하다.

 

보조 스트림

스트림의 기능을 향상시키거나 새로운 기능을 추가하기 위해 사용하고 말 그대로 보조 스트림이므로

실제 데이터를 주고받는 스트림이 아니라서 입출력 처리가 불가능하다.

따라서 기반 스트림을 먼저 생성한 다음 보조 스트림을 생성해야한다.

 

보조 스트림은 문자 변환,입출력 성능, 객체 입출력 등의 기능을 제공하고

이 중 문자 변환 보조 스트림 InputStreamReader, OutputStreamWriter는 문자 단위로 입출력을 하기 때문에

데이터가 문자라면 바이트 기반의 스트림보다 편리하게 사용할 수 있다.

 

일전에 우리가 Scanner로 입력을 받아 왔었는데 성능 향상 보조 스트림은 그보다 훨씬 빠른 속도로

입출력을 할 수 있다. 입출력 소스와 직접 작업하지 않고 버퍼에 데이터를 모아 한꺼번에 작업을 해서

입출력 횟수를 줄이기 때문에 실행 성능이 좋다.

BufferedInputStream/Reader, BufferedOutputStream/Writer가 있다.

 

객체 입출력 보조 스트림인 ObjectInputStream과 ObjectOutputStream은 객체를 파일 또는 네트워크로

입출력 할 수 있는 기능을 제공한다. 하지만 객체는 문자가 아니기 때문에 바이트 기반 스트림으로

데이터를 변경해주는 직렬화가 필수가 된다.

 

직렬화 / 역직렬화

Serializable 인터페이스를 implements해서 구현한다. 객체 직렬화 시 private 필드를 포함한 모든 필드를

바이트로 변환하지만 transient 를 사용한 필드는 직렬화에서 제외시킬 수 있다.

역직렬화는 직렬화된 객체를 역직렬화할 때는 직렬화 했을 때와 같은 클래스를 사용한다.

이 때 클래스 이름이 같더라도 클래스 내용이 변경되면 역직렬화가 불가능하다.

 

직렬화를 할땐 같은 클래스임을 알려주는 식별자 역할로 serialVersionUID 필드가 추가되는데

컴파일 시 JVM이 자동으로 해주기 때문에 별도로 작성하지 않아도 오류가 나지 않지만

자동 생성 시 역직렬화에서 예상치 못한 Exception을 유발할 수 있기 때문에 명시를 하는것을 추천한다.