입출력 I/O
1. 자바에서의 입출력
컴퓨터 내부 또는 외부의 장치와 프로그램간의 데이터를 주고받는 것을 말한다.
스트림
데이터를 운반하는데 사용되는 연결통로
단방향 통신만 가능하기 때문에 하나의 스트림으로 입력과 출력을 동시에 처리할 수 없다.
바이트기반 스트림 - InputStream, OutputStream
입력스트림 | 출력스트림 | 입출력 대상의 종류 |
---|---|---|
FileInputStream | FileOutputStream | 파일 |
ByteArrayInputStream | ByteArrayOutputStream | 메모리 |
PipedInputStream | pipedOutputStream | 프로세스간의 통신 |
AudioInputStream | AudioOutputStream | 오디오장치 |
보조 스트림
스트림의 기능을 보완하기 위한 보조스트림이 제공된다.
보조스트림만으로는 입출력을 처리할 수 없고, 스트림을 먼저 생성한 다음에 이를 이요해서 보조스트림을 생성해야한다.
입력 | 출력 | 설명 |
---|---|---|
FilterInputStream | FilterOutputStream | 필터를 이용한 입출력 처리 |
BufferedInputStream | BufferedOutputStream | 버퍼를 이용한 입출력 성능 향상 |
DataInputStream | DataOutputStream | int, float와 같은 기본형 단위로 데이터를 처리하는 기능 |
SequenceInputStream | 없음 | 두 개의 스트림을 하나로 연결 |
LineNumberInputStream | 없음 | 읽어 온 데이터의 라인 번호를 카운트 |
ObjectInputStream | ObjectOutputStream | 데이터를 객체 단위로 읽고 쓰는데 사용. 주로 파일을 이용하며 객체 직렬화와 관련있음 |
없음 | PrintOutputStream | 버퍼를 이용하며, 추가적인 print관련 기능 |
PushbackInputStream | 없음 | 버퍼를 이용해서 읽어 온 데이터를 다시 되돌리는 기능 |
문자 기반 스트림 - Reader, Writer
Java에서는 char가 2byte이기 때문에 바이트 기반의 스트림으로 문자를 처리하는데 어려움이 있다.
문자데이터를 입출력할 때는 바이트기반 스트림 대신 문자기반 스트림을 사용하자.
보조스트림 역시 이름만 다를 뿐 사용목적과 방식은 바이트기반과 다르지 않다.
2. 표준입출력과 File
표준 입출력 - System.in, System.out, System.err
System.in 콘솔로부터 데이터를 입력받는데 사용
System.out 콘솔로 데이터를 출력하는데 사용
System.err 콘솔로 데이터를 출력하는데 사용
표준입출력 대상변경 - setOut(), setErr(), setIn()
입출력을 콘솔 이외에 다른 입출력 대상으로 변경하는 것이 가능하다.
RandomAccessFile
하나의 클래스로 파일의 입력과 출력을 모두 할 수 있도록 되어 있다.
파일의 어느 위치에나 읽기/쓰기가 가능하다.
File
File클래스를 통해서 파일과 디렉토리를 다룰 수 있다.
3. 직렬화(Serialization)
객체를 데이터 스트림으로 만드는 것
스트림으로부터 데이터를 읽어서 객체를 만드는 것을 역직렬화라고 한다.
Serializable
Serializable인터페이스를 구현한 클래스는 직렬화가 가능하다.
조상클래스가 Serializable을 구현했다면 해당 클래스는 직렬화가 가능하다.
조상클래스가 Serializable을 구현하지 않았다면 자손클래스를 직렬화할 때 조상클래스에 정의된 인스턴스변수는 직렬화 대상에서 제외된다. 따라서, 모든 클래스의 조상인 Object는 Serializble을 구현하지 않았기 때문에 직렬화할 수 없다.
transient
직렬화하고자 하는 객체의 클래스에 직렬화가 안 되는 객체에 대한 참조를 포함하고 있다면, 제어자 transient를 붙여서 직렬화 대상에서 제외할 수 있다.
직렬화가능한 클래스의 버전관리
직렬화된 객체를 역직렬화할 때 직렬화 했을 때와 같은 클래스를 사용해야 한다.
객테가 직렬화될 때 클래스에 정의된 멤버들의 정보를 이용해서 serialVersionUID라는 클래스의 버전을 자동생성해서 직렬화 내용에 포함한다.
클래스의 버전을 수동으로 관리할 수 있다. 클래스 내에 serialVersionUID를 정의해주면, 클래스의 내용이 바뀌어도 클래스의 버전이 자동생성된 값으로 변경되지 않는다.
serialVersionUID의 값은 어떠한 값으로도 지정할 수 있지만 중복되지 않기 위해 serialver.exe를 사용해서 생성된 값을 사용하는 것이 일반적이다.
Last updated