자바 직렬화 | 자바 입문강좌 58

자바 직렬화

자바의 직렬화는 인스턴스를 다루는 기법입니다. 객체와 바이트 스트림 간의 변환을 직렬화라고 합니다.

인스턴스라 함은 객체를 메모리에 생성하여 사용하는 것을 말합니다. 그런데 런타임 도중에 상태를 유지하던 인스턴스가 프로그램이 종료하면 메모리에서 해제되기 때문에 보존이 안됩니다.

인스턴스의 상태를 계속 보관하려면 파일로 저장할 수 있습니다. 기왕 인스턴스의 상태를 저장할 거면 스트림의 장점을 활용할 수 있습니다. 이전 학습에서 배운 FileInputStream 들과 함께 사용할 수 있기 때문에 자바의 직렬화는 객체의 저장, 입출력을 하는데 많은 이점을 갖습니다.

아래 예제는 객체의 인스턴스를 ObjectStream 으로 전환하여 사용하는 방식입니다.

직렬화를 하려는 클래스에 Serializable 을 구현하면 됩니다. 직렬화를 할 때는 차후 클래스에 업데이트를 생각하여 버전관리가 필요합니다. 그래서 serialVersionUID 를 사용하는데 이클립스나 인텔리제이에서도 버전값을 생성하는 기능이 있습니다.

package com.kay;

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException, ClassNotFoundException {

        MySerial ms1 = new MySerial("string", 10);
        MySerial ms2 = new MySerial("text test", 7);

        FileOutputStream fos = new FileOutputStream("mySerial.out");
        ObjectOutputStream oos = new ObjectOutputStream(fos);

        oos.writeObject(ms1);
        oos.writeObject(ms2);

        FileInputStream fis = new FileInputStream("mySerial.out");
        ObjectInputStream ois = new ObjectInputStream(fis);

        MySerial mc3 = (MySerial) ois.readObject();
        MySerial mc4 = (MySerial) ois.readObject();

        mc3.show();
        mc4.show();

    }
}

class MySerial implements Serializable{
    private static final long serialVersionUID = -2001242650282144728L;
    int var;
    String str;

    public MySerial(String str, int var) {
        this.str = str;
        this.var = var;
    }

    public void show(){
        System.out.print("var = " + var);
        System.out.println(", str = " + str);
    }
    public MySerial(){}
}
var = 10, str = string
var = 7, str = text test

위의 과정을 나열하면

인스턴스 생성 -> FileOutputStream -> ObjectOutputStream -> 직렬화 File -> ObjectInputStream -> FileInputStream -> 인스턴스 복구

과 같습니다.

(직렬화 File 생성) 까지가 직렬화이고 나머지가 역직렬화입니다.

상태를 저장하는 것이기 때문에 State Save, Snapshot 같은 기능입니다.

요약

자바 직렬화 기능을 사용하면 객체를 사용하는 확장성이 늘어납니다. 프로그램의 종료시에도 객체의 상태를 저장할 수도 있고 네트워크에 전송하기 적합한 바이트 스트림으로 변환할 수 있습니다.

스트림을 받는 쪽은 역직렬화해서 똑같은 인스턴스로 복구 할 수 있습니다. 당연하지만 복구하는 쪽에서도 같은 클래스가 있어야 똑같이 복구를 할 수 있습니다.

또 메소드의 경우 클래스에서 반복사용되는 코드라서 상태를 저장할 필요는 없습니다.

직렬화의 용어 때문에 어려워보이는 것은 사실입니다. 소프트웨어 공학에서 어려운 것은 내용보다는 용어적인 부분이 많습니다. 이해하려고 마음을 먹고 접근하면 대부분은 어렵지 않게 해결할 수 있습니다.

그런 지식들을 쌓으면 제대로 구조를 갖춘 프로그램을 완성될 수 있는 기초가 됩니다.

자바 입문강좌가 이제 58회로 1회 부터 여기까지 왔다면 기초 단계는 이제 지난 것으로 생각할 수 있습니다. 물론 대강 읽었다고 자바 실력이 늘지는 않습니다. 모든 기초 튜토리얼 코드를 직접 실행해보고 한 주제에 관하여 영문 참고문서를 최소 3개 이상은 읽어두어야 약간 감이 올거라고 생각합니다. 보통 사람의 기준으로 잡으면 그렇습니다.

컴퓨터 프로그래밍은 어느정도 재능이 필요한 분야라서 사람마다 학습진도에 차이는 있습니다. 하지만 아주 높은 지식을 요구하는 분야가 아닌 것은 확실합니다.

최근 미국의 IT 인력들이 빠르게 늘고 있는데 미국도 비전공자 부트캠프 출신이 많습니다. 한국과 차이점을 보면 그들의 모국어가 영어라는 점 입니다. 이것에는 분명한 차이가 있습니다. 잘 이해가 안가면 한글로 코딩을 한다고 생각해보세요.

System.out.println 은 가장 기초지만 자바 기초과정이 끝날 때까지도 가장 이해하기 어려운 메소드입니다.

이것을 한글로

시스템.표준출력.한줄을 모니터에 인쇄("안녕하세요. 자바 프로그래밍!");

이렇게 바꾼다면 프로그래밍을 모르는 한국 사람도 어느정도 이해할 수 있을 것입니다.

  • 시스템 -> 컴퓨터 시스템
  • 표준출력 -> 어딘가에 출력한다
  • 한줄을 모니터에 인쇄 -> 문자열을 모니터에 쓴다

이렇게 해석할 수 있기 때문입니다. 그런데 System out println 은 무슨말인지 짐작이 안갑니다. 특히 out 은 영어에서 ‘바깥’ 으로 배웠습니다. 근데 out 의 진짜 뜻은 output (출력)을 추상화한 객체입니다.

프로그래밍 용어에는 이런 추상화된 영어적 표현들이 많습니다. 그러니까 한글 사용자에게는 일단 용어자체가 커다란 장벽이 됩니다. 영어를 잘하지 못해도 코딩을 잘할 수 있지만 영어를 잘하면 코딩을 더 잘할 수 있다는 것은 틀림 없습니다.

영미권에는 초등학교때 이미 스스로 독학으로 상당한 경지에 이르는 경우가 많습니다. 한국에서는 정말 재능이 있는 친구들에게 가능한 일이 저들에게는 훨씬 접근성이 쉽습니다.

자바 직렬화라는 것을 어렵게 설명하고 어렵게 이해하는 것 보다 영어실력을 늘리는 것이 모든 IT기술 습득에 훨씬 도움이 됩니다. Serial 연속, 연쇄 라는 단어의 사용법을 알면 왜 모국어가 영어인 자바의 개발자가 이 단어를 선택했는지 더 잘 이해할 수 있습니다.

자바의 깊은 맛을 느끼기 위해 Serialzation 에 관하여 아래 영문 참고 문서들을 많이 읽어 보시길 바랍니다.

참고문서

Java – Serialization – Tutorialspoint

Serialization in Java – javatpoint

Introduction to Java Serialization | Baeldung

Serializable Objects 자바 직렬화 – 오라클 (oracle.com)

Serialization and Deserialization in Java with Example – GeeksforGeeks

Leave a Comment