transient 키워드는 직렬화에서 특정 필드를 제외하고자 할 때 사용되는 키워드입니다. 직렬화는 객체의 상태를 바이트 스트림으로 변환하는 과정이며, 모든 객체의 필드가 이 과정에 포함되게 됩니다. 그러나 때로는 특정 필드를 직렬화에서 제외하고 싶을 때가 있습니다. 이때 transient 키워드를 사용합니다.
transient 사용 예제
import java.io.*;
class MyClass implements Serializable {
private static final long serialVersionUID = 1L;
private int regularField;
private transient String transientField;
// 생성자, 메서드 등 클래스의 내용
// ...
}
위의 예제에서 transientField는 transient 키워드로 선언되었습니다. 이는 해당 필드가 직렬화에서 제외된다는 것을 의미합니다. 즉, transientField는 객체가 직렬화될 때 포함되지 않고, 역직렬화될 때는 기본값으로 초기화됩니다.
transient 키워드의 사용 이유
1. 보안 및 민감한 정보: 어떤 필드는 보안상 민감한 정보일 수 있습니다. 이러한 정보를 직렬화하지 않고 제외함으로써 보안 문제를 완화할 수 있습니다.
private transient String password;
2. 임시 데이터: 객체의 특정 필드가 일시적이고 영구적으로 저장할 필요가 없는 경우 transient를 사용하여 해당 필드를 직렬화에서 제외할 수 있습니다.
private transient String cacheData;
3. 직렬화 불가능한 객체 참조: 어떤 필드가 직렬화할 수 없는 객체를 참조한다면, 해당 필드는 transient로 선언하여 직렬화에서 제외됩니다.
private transient NonSerializableObject nonSerializableObject;
주의사항
1. transient 필드의 초기화: transient로 선언된 필드는 직렬화될 때 제외되기 때문에 역직렬화 후에는 기본값으로 초기화됩니다. 초기화에 대한 로직이 필요하다면 readObject 메서드를 사용하여 직접 초기화할 수 있습니다.
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
transientField = "Default value"; // 초기화 로직
}
2. transient와 static: transient와 static을 동시에 사용할 수 없습니다. static 필드는 클래스의 상태를 나타내므로 인스턴스마다 다르게 직렬화할 필요가 없기 때문입니다.
private transient static int staticTransientField; // 컴파일 에러
3. 직렬화된 클래스 버전 UID의 영향: transient로 선언된 필드가 있다면 해당 필드는 직렬화에서 제외되지만, 클래스의 직렬화 버전 UID는 포함됩니다. 그러므로 transient 키워드를 추가하거나 제거해도 클래스의 UID는 변경되지 않습니다.
With ChatGPT
'JAVA > 포스팅' 카테고리의 다른 글
자바 클라이언트(client)와 서버(sever) (0) | 2023.11.27 |
---|---|
자바 네트워킹(Networking) (0) | 2023.11.27 |
자바 직렬화 Serializable (0) | 2023.11.26 |
자바 ObjectOutputStream (0) | 2023.11.26 |
자바 ObjectInputStream (0) | 2023.11.26 |