직렬화에 대한 개념 질문입니다!

조회수 4274회

안녕하세요! 오늘은 직렬화에 대해서 궁금한 점이 있어서 글 남김니다!

일단 직렬화(serialization) 이라는 것이 객체를 파일에 저장하거나 네트워크를 통해서 다른 곳에 보내거나 받는 곳에 사용한다고 하네요

직렬화를 하면 어차피 메소드는 저장되지 않는다고 하고(라이브러리에 따라 다를수도 있지만..?) 객체마다 달라지는 인스턴스 변수를 저장한다고 현재 보고 있는 책에는 나와있습니다.(Java 책입니다.)

음... 궁극적으로 궁금한 것은.... "객체에서 getter를 통해서 변수들을 꺼내서 파일에 저장하고, 다시 복구 할 때는 setter를 통해서 객체를 복구할 수도 있지만, 직렬화를 통해서 하면 그냥 편하기 때문에 사용하는 것인가요?" 입니다.

감사합니다.. 헣..

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 만약 제가 생각한 것이 맞다면 장점은 "편하다"이고 단점은"느리다" 이겠군요 알 수 없는 사용자 2016.11.25 19:19

1 답변

  • 직렬화의 목적을 올바르게 이해하시면 됩니다.

    • 컴퓨터 A에 있는 정보를 컴퓨터 B에 전송하기 위한 것이 직렬화입니다.
    • 객체직렬화하게 되면 일련의 바이트 스트림으로 변환됩니다.
    • 직렬화된 정보를 복원하는 것을 역직렬화라고 하는 데, 이를 통해서 객체의 원형을 복원할 수 있습니다.

    질문에서 언급한대로, 객체에서 getter와 setter를 사용하는 것은 같은 컴퓨터에 있을 경우에는 가능합니다. 따라서 같은 컴퓨터에 사용할 경우에는 직렬화에 대한 고민을 할 필요가 없습니다.

    그러나 사용하고 있는 이 객체를 다른 컴퓨터(혹은 종료된 후, 재실행되었을 때)에 전송하여, 그대로 사용하는 것에 대한 고민한다면, 직렬화가 필요로 합니다.

    객체를 어떻게 해야 다른 컴퓨터에 전송하여 그 객체를 그대로 사용할 수 있을까요?

    기본적으로 다음과 같은 생각을 해볼 수 있을 겁니다.

    1. 원본에서 사용하고 있는 프로그램코드(함수, 로직 등)이 그대로 대상컴퓨터에도 있어야할 겁니다.
    2. 1항이 만족하더라도, 코드만 존재할 뿐 사용하고 있는 객체가 가지고 있었던 정보는 대상컴퓨터에 없습니다.
    3. 따라서 컴퓨터A에서 존재하였던 객체가 가진 정보를 컴퓨터B에도 전달해야할 필요가 있습니다.

    자바의 Serializable(직렬화)

    • 자바는 분산환경(서로 다른 컴퓨터에서 주어진 목적을 위해서 협력하는 환경)에서 분산된 컴퓨터들에서 객체정보를 주고 받을 수 있게 하기 위해서 RMI (Remote Method Invocation, 원격 메서드 호출)을 지원합니다. (일반적으로 RPC - Remote Procedure Call, 원격 프로시저 호출 - 라고 부르며, 다른 언어나 플랫폼에도 개념이 있습니다. )
    • 메서드의 경우 메서드 인자로 객체가 전달될 수 있고, 또한 메서드의 반환(return)결과로 객체가 전달될 수 있습니다.
    • 그런데 이 함수를 호출하는 쪽은 컴퓨터A이고, 이 메서드가 실행되는 곳은 컴퓨터B인 환경을 지원하는 것이 자바의 RMI입니다.
    • RMI를 동작하게 하기위해서는 객체를 네트워크로 전송가능한 형태로 바꿀 필요가 있는 데, 이 때 사용되는 개념이 직렬화/역직렬화입니다.
    • 객체를 복원가능하면서 전송이 가능한 상태로 바꾸는 작업이 직렬화입니다. 역직렬화는 반대로 작업하여 다시 객체로 되게 만드는 것입니다.
    • 자바는 객체중에 직렬화가 가능한 객체를 표시하기 위해서는 Serializable 인터페이스를 상속하게 하고 있습니다. 이 경우, 객체를 메모리에 생성할 때부터, 직렬화를 염두에 두고 관리합니다.

    직렬화

    • 직렬화는 자바의 Serializable를 사용하지 않더라도, 정보를 대상 시스템에 복원가능하게 전달하기 위해서 다른 형태(텍스트, 바이트, JSON, XML 등)로 변경하는 행위 일체를 말합니다. 자바의 경우, Serializable 인터페이스를 통해서 편의성을 제공해줍니다.
    • 자세한 답변 정말 감사드립니다! 그럼 현재 저희가 사용하는 인터넷에서 데이터를 주고 받는 모든것은 직렬화가 되어있는 것인가요?? 알 수 없는 사용자 2016.11.25 23:08
    • 객체지향 프로그래밍에서 정보는 모두 객체로 되어있는데, 이 객체를 주고 받는 행위의 바탕에 직렬화/역직렬화 과정이 있다라고 생각하셔도 무방할것 같습니다. 허대영(소프트웨어융합대학) 2016.11.28 12:21

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)