[스터디]Java의 정석 30일차

Kristopher·2022년 2월 3일
0

Java 스터디

목록 보기
30/31

(Ch 15) 6. 표준입출력과 File ~

7.4 직렬화가능한 클래스의 버전관리

표준입출력 - System.in, System.out, System.err

표준입출력은 콘솔을 통한 데이터의 입력과 출력을 의미한다. 자바에서는 표준 입출력을 위해 System.in, System.out, System.err을 제공하는데, 이들은 자바 어플리케이션 실행과 동시에 자동 생성되기 때문에 개발자가 별도로 스트림을 생성하지 않아도 사용가능하다.

System.in : 콘솔로부터 데이터를 입력받는데 사용
System.out : 콘솔로 데이터를 출력하는데 사용
System.err : 콘솔로 데이터를 출력하는데 사용

3가지 입출력 스트림의 타입은 InputStream과 PrintStream이지만 실제로는 버퍼를 이용하는 BufferedInputStream과 BufferedOutputStream의 인스턴스를 사용한다.

표준입출력의 대상변경 - setOut(), setErr(), setIn()

setOut(), setErr(), setIn()를 사용하면 콘솔이 아닌 다른 입출력 대상으로 변경하는 것이 가능하다.

RandomAccessFile

RandomAccessFile은 하나의 클래스로 파일에 대한 입/출력을 모두 수행할 수 있도록 설계되어 있다. DataInput인터페이스와 DataOutput인터페이스를 모두 구현하였다. 가장 큰 장점으로는 파일의 어느 위치에나 일기/쓰기가 가능하다는 것이다. 다른 입출력 클래스들은 순차적으로 일기/쓰기를 실행해 제한적인 반면 RandomAccessFile클래스는 제한이 없다.

직렬화

직렬화란 객체를 데이터 스트림으로 만드는 것을 뜻한다. 즉 객체에 저장된 데이터를 스트림에 쓰기위해 연속적인 데이터로 변환하는 작업을 말한다. 반대로 스트림으로부터 데이터를 읽어 객체를 만드는 것을 역직렬화라고 한다. 여기서 말하는 객체란 클래스에 정의된 인스턴스변수의 집합이다. 객체에는 클래스변수나 메서드가 포함되지 않는다.

ObjectInputStream, ObjectOutputStream

직렬화에는 ObjectOutputStream을 사용하고, 역직렬화에는 ObjectInputStream을 사용한다. 각각은 OutputStream과 InputStream을 직접 상속받지만 기반스트림을 필요로 하는 보조 스트림이므로 객체 생성시 입출력할 스트림을 지정해주어야 한다.

직렬화 가능한 클래스 만들기 - Serializable, transient

직렬화하고자하는 클래스가 java.io.Serializable인터페이스를 구현하도록 하면 직렬화가 가능한 클래스를 만들 수 있다. 조상이 Serializable인터페이스를 구현하였다면 자손 클래스도 직렬화가 가능하다.

public class UserInfo implements Serializable{
    Object obj = new Object(); // 직렬화 불가능
    Object obj = new String("abc"); // 직렬화 가능
}

Object 객체는 직렬화할 수 없지만, 실제로 저장된 객체가 직렬화가 가능하다면 직렬화를 수행할 수 있다.

직렬화가능한 클래스의 버전관리

직렬화된 객체를 역직렬화할 때는 직렬화 했을 때와 같은 클래스를 사용해야한다. 그러나 클래스의 이름이 같더라도 내용이 변경된 경우에는 역직렬화에 실패하기 때문에 버전을 일치시켜야 한다. 객체를 직렬활 할 때 serialVersionUID라는 클래스 버전을 자동생성해서 직렬화 내용에 포함한 뒤, 역직렬화 할 때 클래스의 버전을 비교할 수 있게 한다.

Reference

Java의 정석
남궁성의 정석코딩

profile
개발자 지망생입니다.

0개의 댓글