반응형

객체(Object) 입출력

 

 

자바에서 클래스로 생성한 객체를 직접 입출력에 사용할 수 있다. 이것을 객체 입출력이라고 하는데 바이트 단위 스트림기반으로 동작한다.
핵심 클래스와 메서드는 다음과 같다.

* Serializable 인터페이스
* ObjectOutputStream 클래스
 - writeObject();
* ObjectInputStream 클래스
 - readObject();

 

객체 입출력에 사용되는 클래스는 반드시 java.io.Serializable을 구현하도록 해야 하는데 이는 객체를 입출력 하려면 바이트 단위로 직렬화를 해야 하기 때문이다.

직렬화 개념도

 

 Info 클래스로 만들어진 객체가 있다면 모양이 일정하지 않으므로 전송이 가능하도록 분할하는 작업이 직렬화이다.

직렬화된 데이터에는 클래스의 정보가 포함된다.

(transient멤버 데이터는 직렬화에 포함시키지 않는다.)
전송된 곳에서는 원래의 객체 모양으로 역 직렬화를 하여 Object로 객체를 참조하게 된다.

(다운캐스팅 필요)
위와 같은 동작이 가능하도록 클래스에 선언해주는 것이 implements Serializable 구현 선언이다.

 

입출력에 사용할 클래스를 하나 작성한다.

package exam;

import java.io.Serializable;

public class Info implements Serializable {
	private String name;
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;

	}
}

위에 implements Serializable선언이 바로 직렬화가 가능하도록 하는 부분이다.
readObject()나 writeObject()메서드는 Serializable로 객체를 직렬화하여 전송하기 때문에 

사용자 정의 클래스로 만든 객체를 입출력 하기 위해서는 위와 같은 선언이 반드시 필요하다.

 

다음 예제는 객체를 파일에 출력하는 예제이다.

package exam;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class Exam {
	public static void main(String[] args) throws IOException {
		Info info = new Info();
		
		info.setName("홍길동");
		info.setAge(29);
		
		File f = new File("test.txt");
		FileOutputStream fos = new FileOutputStream(f);
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		
		oos.writeObject(info);
		oos.flush();
		
		oos.close();

	}
}

실행하면 지정된 파일에 다음과 같이 직렬화된 객체가 출력되어 있다.

 

내용이 이상한 것 같지만 객체의 클래스 정보와 값들이 저장되어 있는 것이다.
이러한 객체는 역 직렬화 하여 원래의 객체로 변환이 가능하다.

 

다음 예제는 파일에 저장된 객체를 읽어오는 예제이다.

package exam;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class Exam {
	public static void main(String[] args) throws IOException {
		File f = new File("test.txt");
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream(f));
		
		try {
			Info tmp = (Info) ois.readObject(); //객체 읽어오기
			
			System.out.println(tmp.getName());
			System.out.println(tmp.getAge());
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}

readObject()는 읽어 들인 객체의 타입이 무엇인지 모르는 상태이므로

형 변환(casting)을 통한 실제 객체 형태의 참조가 필요하다.

실행하여 파일에 저장된 내용이 잘 출력 되는지 확인해보자.

 

실행결과


여기까지 객체단위의 입출력을 확인해 보았다. 직렬화 중요!

 

 

반응형

'교육자료 > Java' 카테고리의 다른 글

자바의 애노테이션 이해하기  (0) 2018.10.15
Java IO 문자스트림(char기반)  (0) 2017.07.02
Java IO 바이트스트림(byte기반)  (0) 2017.06.30
Java IO - File class  (0) 2017.06.30
Java Thread (쓰레드)  (0) 2017.06.30

+ Recent posts