Java (자바)

[Java] 데이터 직렬화 / Serializable

Oscar:) 2024. 3. 30. 16:45

 

 

이번 포스팅에서는 데이터 직렬화에 대해 알아보자.

 

 


 

직렬화란?

 

 

 

 

메모리에 있는 데이터를 네트워크 통신으로 전달하거나

디스크 등에 저장하기 위한 형식으로 변환하는 것을 말한다.

 

여기서 말하는 데이터 형식은 바이트 스트림이며,

Java의 최소 단위인 Byte 형태의 연속적인 데이터로 변환한 것이다.

 

 

 

직렬화의 반대 경우를 역직렬화라고 하며

전달 받거나 저장된 바이트 스트림을 메모리에 적재할 수 있도록 다시 변환하는 것을 말한다.

 

 


 

직렬화가 필요한 이유

 

 

아무래도 메모리 내 데이터를 다루는 내용이기에,

메모리의 Stack · Heap 영역에 대한 기본적인 지식이 없다면 다음 포스팅을 참고하면 도움이 될 것이다.

 

[Java] JVM 메모리 할당 방식 - Stack · Heap Memory

지난 포스팅에서 JDK · JRE · JVM에 대해 간단히 알아보았다. [Java] JDK · JRE · JVM JDK · JRE · JVM에 대해 알아보자. JDK Java Development Kit Java로 프로그램을 개발하는데 필요한 툴을 모아놓은 소프트웨어

oscarstory.tistory.com

 


 

 

만약 원시 타입의 데이터만을 처리해야 한다면 직렬화는 필요없다.

 

 

메모리 Stack 영역의 value를 그대로 전달하고 받을 수 있기 때문이다.

 


 

 

반면 참조 타입의 경우, Heap 영역을 가리키는 주소값을 전달할 수는 없기 때문에

Heap 영역의 실제 데이터를 저장 · 전달하기 위해 직렬화가 필요하다.

 

직렬화된 데이터는 언어에 따라 바이너리, 텍스트 등의 형식으로 변환된다.

 

 

 

 


 

Java에서의 직렬화 - Serializable

 

 

Java에서는 객체를 직렬화하기 위해서 Serializable 인터페이스를 사용할 수 있다.

 

데이터 클래스를 직렬화한다고 가정해 보겠다.

public class Client implements Serializable {

    int number;
    String name;

    public Client(int number, String name) {
        this.number = number;
        this.name = name;
    }

    public int getNumber() {
        return number;
    }

    public String getName() {
        return name;
    }

}

 

위처럼, 해당 데이터 클래스에 Serializable 인터페이스를 implements 해준다.

 

Serializable 인터페이스는 직렬화 여부를 판단하는 기준으로 사용되기에,

별도의 메서드를 @Override 하지 않아도 된다.

 

 

 

Intent로 객체를 전달할 때 Serializable 인터페이스로 객체를 직렬화하여 전달할 수 있다.

 

A Activity → B Activity로 객체를 전달하는 간단한 예제다.

// A Activity
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_intent);

    Intent intent = new Intent(AActivity.this, BActivity.class);
    intent.putExtra("client", new Client(1, "Oscar"));
    startActivity(intent);

}


// B Activity
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_intent2);

    Intent intent = getIntent();
    Client client = (Client) intent.getSerializableExtra("client");

    Log.d("TAG", "Client : " + client.getNumber() + " / " + client.getName());

}

 

getSerializableExtra() 메서드로 직렬화된 객체를 전달 받고, Client 객체에 초기화 해주었다.

 

 

결과)

 

데이터 클래스라는 객체를 성공적으로 전달 받은 것을 확인할 수 있다.

 

 


 

 

 

 

데이터 직렬화에 대해 알아보았다.