자바 에서 transient 키워드 용법 분석
자바 의 특징 은 직렬 화 입 니 다. 쉽게 말 하면 이 종 류 를 물리 적 공간 (물론 파일 로 존재 합 니 다) 에 저장 할 수 있 습 니 다. 그러면 로 컬 에서 이 파일 을 복원 할 때 그 자체 로 변환 할 수 있 습 니 다.이것 은 네트워크 의 일부 조작 을 크게 편리 하 게 할 수 있 지만 동시에 안전 문제 와 관련 되 기 때문에 클래스 안의 모든 것 을 저장 하 는 것 을 원 하지 않 는 다 (그 렇 기 때문에 다른 사람 은 직렬 화 를 통 해 클래스 안의 내용 을 알 수 있다). 그러면 우 리 는 transient 라 는 키 워드 를 사용 할 수 있다. 이것 은 임시 적 인 것 이다. 즉, 클래스 와 함께 현지 로 서열 화 되 지 않 는 다 는 뜻 이다.그래서 복원 하면 이 키워드 가 정의 하 는 변 수 는 더 이상 존재 하지 않 습 니 다.
일반적으로 우리 가 쓰 는 프로그램 은 특정한 정보 가 디스크 에 지속 적 으로 존재 하거나 저장 되 어 한 프로그램 이 같은 프로그램의 다른 실행 에 사용 하거나 사용 할 수 있 도록 요구 합 니 다. 이러한 지속 성 은 데이터베이스 에 쓰 거나 JAVA 를 이용 하여 이미지 직렬 화 에 대한 지원 을 포함 하여 몇 가지 방식 으로 이 루어 질 수 있 습 니 다. 우리 가 어떤 방법 을 선택 하 든,클래스 인 스 턴 스 의 지속 성 은 클래스 의 도 메 인 상 태 를 저장 함으로써 이 상 태 를 저장 합 니 다. 나중에 접근 하거나 사용 하여 같은 인 스 턴 스 를 만 들 수 있 도록 합 니 다. 그러나 모든 도 메 인 이 저장 되 어야 하 는 것 은 아 닐 수도 있 습 니 다. 인 스 턴 스 가 지속 되 었 을 때 내부 의 일부 도 메 인 은 지속 되 지 않 아 도 됩 니 다.컴 파일 러 가 지정 한 도 메 인 이 오래 저장 되 지 않 아 도 된다 는 것 을 trainsient 수정자 로 알려 줄 수 있 습 니 다. 우선 자바 serialization 코드 를 보 여 줍 니 다.
public class LoggingInfo implements java.io.Serializable
{
private Date loggingDate = new Date();
private String uid;
private transient String pwd;
LoggingInfo(String user, String password)
{
uid = user;
pwd = password;
}
public String toString()
{
String password=null;
if(pwd == null)
{
password = "NOT SET";
}
else
{
password = pwd;
}
return "logon info: /n " + "user: " + uid +
"/n logging date : " + loggingDate.toString() +
"/n password: " + password;
}
}
현재 우 리 는 이러한 인 스 턴 스 를 만 들 고 직렬 화 (serialize) 한 다음 에 이 직렬 화 대상 을 디스크 처럼 씁 니 다.
LoggingInfo logInfo = new LoggingInfo("MIKE", "MECHANICS");
System.out.println(logInfo.toString());
try
{
ObjectOutputStream o = new ObjectOutputStream(
new FileOutputStream("logInfo.out"));
o.writeObject(logInfo);
o.close();
}
catch(Exception e) {//deal with exception}
To read the object back, we can write
try
{
ObjectInputStream in =new ObjectInputStream(
new FileInputStream("logInfo.out"));
LoggingInfo logInfo = (LoggingInfo)in.readObject();
System.out.println(logInfo.toString());
}
catch(Exception e) {//deal with exception}
이 코드 를 실행 하면 디스크 에서 읽 기 (read - back (de - serializing) 대상 이 password 를 'NOT SET' 로 인쇄 하 는 것 을 알 수 있 습 니 다.이것 은 우리 가 pwd 역 을 transient 로 정의 할 때 기대 하 는 정확 한 결과 입 니 다.
이제 transient 도 메 인 에 대한 부주의 로 인 한 잠재 적 인 문 제 를 살 펴 보 자.만약 에 우리 가 클래스 정 의 를 수정 했다 고 가정 하면 transient 도 메 인 에 기본 값 을 제공 합 니 다. 코드 는 다음 과 같 습 니 다.
public class GuestLoggingInfo implements java.io.Serializable
{
private Date loggingDate = new Date();
private String uid;
private transient String pwd;
GuestLoggingInfo()
{
uid = "guest";
pwd = "guest";
}
public String toString()
{
//same as above
}
}
현재 GuestLoggingInfo 의 인 스 턴 스 를 뚫 고 디스크 에 기록 하고 디스크 에서 읽 으 면 읽 은 대상 이 password 를 'NOT SET' 로 인쇄 하 는 것 을 볼 수 있 습 니 다.디스크 에서 어떤 종류의 인 스 턴 스 를 읽 을 때 실제 적 으로 이러한 구조 함 수 를 실행 하지 않 고 이러한 대상 의 지구 화 상 태 를 불 러 오고 이 상 태 를 다른 대상 에 게 할당 합 니 다.
본 고 에서 말 한 것 이 여러분 의 자바 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.