객체지향 언어에서 객체를 입출력하지 못한다면 참으로 안타까운 상황이 일어나겠죠. 하지만 이미 고슬링 형님은 알고 계셨습니다. 객체를 입출력 해야한다는 것을...
그래서 오늘은 객체의 입출력에 대해 알아봅시다.
ObjectOutputStream(객체 직렬화)
객체 직렬화란 heap 메모리 상에 있는 객체를 외부로 전송할 수 있는 상태로 만드는 것입니다.
ObjectInputStream(객체 역직렬화)
객체 역직렬화란 외부에 저장되어 있는 정보를 입력받아 heap 메모리 상의 객체로 만드는 것입니다.
역시 글은 너무 추상적이기 때문에 그림을 그려서 확인해봅시다.
Heap 메모리에 있는 객체를 운영체제 위에 있는 Directory에 .obj 파일로 저장하는 과정을 그림으로 간단하게 표현한 것입니다.
이제 예제 코드를 보여드리겠습니다.
예제 코드
객체 직렬화 (Output)
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import common.DirInfo;
public class TestObjectSerialization {
public static void main(String[] args) {
//객체 직렬화 : Person 객체 생성 후 person.obj 에 메모리 상에 있는
// Person 객체를 직렬화하여 전송, 저장
Person p=new Person("안정환",900,"king");
String personPath=DirInfo.OUTPUT_DIR2+"person.obj";
try {
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(personPath));
oos.writeObject(p);
oos.close();
System.out.println(p+" 객체 직렬화하여 파일에 저장");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Person class를 따로 만들어서 진행하시면 됩니다. 생성자랑 getter , setter가 너무 길어서 생략했습니다.
자신이 만든 객체를 자신이 정한 파일 경로에 저장하는 코드입니다. ObjectOutputStream에는 throws IOException이 있기 때문에 try catch 문으로 예외를 잡아야합니다.
1. ObjectOutputStream 객체를 생성하면서 FileOutputStream으로 파일을 직렬화 할 수 있게 객체를 생성합니다.
2. 객체 스트리밍 메소드인 writeObject()를 이용해서 Person객체를 파일로 넘겨줍니다.
3. oos 생성을 닫아줍니다. (닫지 않으면 파일 저장이 되지 않고 애초에 시작부터 에러가 날겁니다.)
이렇게 실행하면 obj 파일이 생성됩니다.
객체 역직렬화 (Input)
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import common.DirInfo;
public class TestObjectDeSerialization2 {
public static void main(String[] args) {
//객체 역직렬화 : person.obj 에 저장된 정보를 역직렬화하여
// 자바 메모리 상의 객체로 복원
String personPath=DirInfo.OUTPUT_DIR2+"person.obj";
try {
ObjectInputStream ois=new ObjectInputStream(new FileInputStream(personPath));
Person p=(Person)ois.readObject();//Object 타입으로 리턴되므로 Person 타입으로 객체 캐스팅이 필요
// password는 transient 명시되어 직렬화 되지 않았음, 그러므로 null 출력
System.out.println(p.getName()+" "+p.getMoney()+" "+p.getPassword());
ois.close();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
위에서 저장한 person.obj에 저장한 안정환 선수의 정보를 가져오겠습니다. 참고로 Person Class의 password는 transient로 명시해서 안보이게 설정했는데, 제 글을 보시는 분들은 알아서 인스턴스 변수 선언을 해주세요.
1. ObjectInputStream 을 생성하기 위해 FileInputStream으로 파일 스트리밍 객체 생성
2. Person 참조형 변수 객체를 가져오는 것이기 때문에 Object의 다운 캐스팅 필요
3. ois 를 종료하면서 스트리밍을 종료
실행하면 이러한 결과가 나오게 됩니다.
소감
드디어 제가 만든 객체들을 저장할 수 있는 날이 왔습니다. 감동적인 순간이 아닐수가 없는데요. DB를 사용하게 되면 더욱 더 짜릿한 경험을 하게 될 것 같습니다. 왜냐하면 객체를 계속 초기화하여 저장하지 않고 있는 것에 추가하거나 수정 삭제 할 수 있기 때문입니다.
자바스크립트의 노드제이에스 모듈들처럼 자바에도 참 많은 라이브러리들이 있어 다행입니다. 아직 사용하려면 많은 시간이 걸리겠지만 꾸준히 하는 것이 좋다고 생각합니다. 오늘 좋은 글귀가 있어서 주소 남기고 오늘 글 마무리하겠습니다.
https://n.news.naver.com/mnews/hotissue/article/032/0003015062?cid=1087637
[직설]재능과 반복
[경향신문] 열아홉 살 때는 재능에 관해 자주 생각했다. 글쓰기 수업에서 친구의 글과 내 글을 비교하다가 질투에 사로잡히는 시절이었다. 내가 더 잘 쓴 것 같다며 우쭐해지는 날도 있었지만 다
n.news.naver.com
'코딩 개발 > Java' 카테고리의 다른 글
Java - Network (Socket 통신) (2) | 2023.04.24 |
---|---|
Java - Thread, Runnable (4) | 2023.04.23 |
Java - File Class에 대한 간단한 예제 (0) | 2023.04.18 |
Java - Exception handling (feat. try, catch, throw, throws) (2) | 2023.04.14 |
Java - Map (0) | 2023.04.12 |