자바에서 transient 필드는 뭐하는 것일까?
객체내에 변수를 사용할때 transient로 지정하게 되면 직렬화(serializing), 또는 역직렬화(deserializing)시에 해당 변수는 직렬화 하지 않는 다는 것을 가리키는 것이다. 한마디로 하면 Object를 파일로 직접 저장할 때 직렬화 기능을 이용하는데, transient로 지정되지 않은 변수 값만 저장한다는 것이다.
간단히 테스트 코드를 작성 후 실행하면 다음 결과가 나온다.
package com.billyvme.serialize.sample;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class TransientSample {
public static final String FILENAME = "data.ser";
/**
* @param args
* @throws IOException
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws IOException,
ClassNotFoundException {
Point before = new Point();
before.x = 7;
before.y = 20;
before.rho = (float) 3.14;
before.theta = (float) 12.15;
writeObject(before);
Object after = readObject();
System.out.print("Before : ");
System.out.println(before);
System.out.print("After : ");
System.out.println(after);
}
private static void writeObject(Object obj) throws IOException {
FileOutputStream fos = new FileOutputStream(FILENAME);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(obj);
oos.close();
fos.close();
}
private static Object readObject() throws IOException, ClassNotFoundException {
FileInputStream fis = new FileInputStream(FILENAME);
ObjectInputStream ois = new ObjectInputStream(fis);
Object result = ois.readObject();
ois.close();
fis.close();
return result;
}
}
class Point implements Serializable {
int x, y;
transient float rho, theta;
@Override
public String toString() {
return String.format("x=%d, y=%d, rho=%f, theta=%f", x, y, rho, theta);
}
}
위 코드를 실행해 보면 다음과 같은 결과가 출력 된다.
Before : x=7, y=20, rho=3.140000, theta=12.150000
After : x=7, y=20, rho=0.000000, theta=0.000000
결과에서 보듯이 transient로 지정되지 않은 x,y 값만 다시 출력되는 것을 확인 할 수 있다.
클래스 내에 암호 값이나 키 값을 속성 내에서 사용하는데 전송되거나 저장되면 안되는 값을 transient로 지정하면 좋을 것 같다.
그런데 실제로 이 지시어를 써서 프로그래밍을 한 적이 없다. 매번 어플리케이션만 개발해서 그런걸까??
'개발자 > Java' 카테고리의 다른 글
자바 테스트를 위한 질문 정리 (0) | 2013.09.24 |
---|---|
Clone 메소드를 이용한 List의 객체 복사 (0) | 2013.06.17 |