javabeat article 번역. 원본 링크 : click

serialization 이란?
transient에 대해 이해를 하려면 먼저 자바에서 serialization 개념에 대한 이해가 필요하다. Serialization은 object를 persistent 상태로 만드는 과정이다. 즉, object를 바이트 스트림으로 만들어 파일에 저장을 하는 것이다. 같은 방식으로 파일에 저장된 바이트 스트림을 de-serialization하여 object로 환원할 수도 있다. 네트워크 프로그래밍을 할 때는 거의 사용되기 때문에 자바에서 가장 중요한 개념들 중 하나이다. 네트워크를 통해 전송되는 모든 object들은 바이트로 바뀌어야 한다. 이러한 이유로 네트워크를 통해 전송되어야 하는 모든 class 혹은 interface는 반드시 serialization interface를 상속받아 구현해야 한다.

transient 란?
자바에서 transient는 serialization이 되지 말아야 할 것을 지정하는데 사용된다. 기본적으로 object의 모든 변수는 persistent 상태로 바뀌게 된다. 경우에 따라 네트워크를 통해 전송할 필요가 없어 serialization할 필요가 없는 변수도 있는데, 이때 해당 변수 앞에 transient 키워드를 선언함으로써 serialization을 막을 수 있다. 이것이 transient 키워드를 사용하는 주된 이유이다.

transient 예제

  1 package javabeat.samples;
  2  
  3 import java.io.FileInputStream;
  4 import java.io.FileOutputStream;
  5 import java.io.IOException;
  6 import java.io.ObjectInputStream;
  7 import java.io.ObjectOutputStream;
  8 import java.io.Serializable;
  9  
 10 class NameStore implements Serializable{
 11     private String firstName;
 12     private transient String middleName;
 13     private String lastName;
 14     public NameStore (String fName,
 15                          String mName,
 16                          String lName){
 17         this.firstName = fName;
 18         this.middleName = mName;
 19         this.lastName = lName;
 20     }
 21     public String toString(){
 22         StringBuffer sb = new StringBuffer(40);
 23         sb.append(“First Name : “);
 24         sb.append(this.firstName);
 25         sb.append(“Middle Name : “);
 26         sb.append(this.middleName);
 27         sb.append(“Last Name : “);
 28         sb.append(this.lastName);
 29         return sb.toString();
 30     }
 31 }
 32 public class TransientExample{
 33     public static void main(String args[]) throws Exception {
 34         NameStore nameStore = new NameStore(“Steve”,
 35                                      “Middle”,“Jobs”);
 36         ObjectOutputStream o = new ObjectOutputStream
 37                    (new FileOutputStream(“nameStore”));
 38         // writing to object
 39         o.writeObject(nameStore);
 40         o.close();
 41  
 42         // reading from object
 43         ObjectInputStream in =new ObjectInputStream(
 44                 new FileInputStream(“nameStore”));
 45         NameStore nameStore1 = (NameStore)in.readObject();
 46         System.out.println(nameStore1);
 47     }
 48 }
 49 // output will be :
 50 First Name : Steve
 51 Middle Name : null
 52 Last Name : Jobs
 53

위의 예제에서 보면 변수 middleName은 transient로 선언되어 있다. 따라서 serialization 되지 않아 저장되지 않을 것이다.