프로그래밍 농장

스크립트 직렬화 (SerializeField / Serializable) [ Unity ] 본문

Unity

스크립트 직렬화 (SerializeField / Serializable) [ Unity ]

Tennessee201 2022. 7. 6.
728x90

객체 지향 프로그래밍(Object Oriented Programming)이 가지는 중요한 특성 중 하나인 캡슐화(Encapsulation)을 보장하기 위하여, 클래스(Class)의 구조를 정의하는 과정에서 '멤버 변수'의 접근 제한자(Access Modifier)를 "private"으로 지정한다.

"캡슐화"는, 공개를 허가한 자료(Data)에 대해서만 외부의 접근과 조작을 허용하고, 실제로 자료가 처리되는 과정 자체는 외부에서 알 수 없도록 숨기는 것을 말한다. (사용자가 제품의 내부 동작을 이해할 필요가 없고, 제품이 정상적으로 동작하기만 하면 됨) 

소프트웨어 공학에서는 이것을 "정보 은닉(Informatin Hiding)"이라고 한다. 객체가 다른 객체의 내부 자료를 직접 확인(참조) 할수는 없고, 해당 객체가 미리 정의해 놓은 어떠한 방법(Method), 즉 메서드를 통해서만 그 객체를 간접적으로 이용할 수 있다. 이렇게 객체를 이용할 수 있는 통로가 되는 것을 "인터페이스(Interface)"라고 이야기할 수 있다. 이러한 동작 구조(Machanism)에 따라서 객체는 다른 객체에 대해서 독립적인 성격을 유지할 수 있다. 


C# Script의 클래스 멤버 변수를 "public"으로 지정함으로서 유니티 에디터의 Inspector에서 해당 변수의 값을 쉽게 변경할 수 있도록 하는 경우가 있다. 이것은 예를 들어 난이도를 조정하기 위해 반복적으로 테스트해야 하는 상황에서 꽤 편리하다. 그러나 "public"을 남발하는 것은 다수의 인원이 협업을 통해 프로젝트를 진행하는 과정에서 문제를 야기할 수 있다. 변경되지 말아야 하는 어떤 자료가 외부 객체로부터 변경될 가능성이 있기 떄문이다. 

그래서 접근제한자 "private"을 통해 객체의 정보를 은닉하고, 캡슐화는 유지하며, 유니티 에디터의 Inspector에서 값을 변경할 수 있도록 사용하는 키워드가 바로 "[SerializeFiled]"이다. (= "스크립트 직렬화")

 

반대로, 변수의 접근제한자가 "public"으로 지정되어 있지만, 유니티 에디터의 Inspector에서 노출되는것을 막기 위해서는  "[HideInInspector]" 키워드를 사용한다. ( HideInInspector 키워드는 키워드 아래에 있는 모든 변수를 노출하지 않지만, Serialized 키워드는 키워드 바로 다음에 있는 변수 1개만을 노출시킨다. )

 

-> 유니티 에디터의 Inspector에는 사용자가 정의한 클래스(Class) 또는 구조체(Stucture)의 정보가 Inspector에 노출되지 않는다. System에서 제공하는 "[Serializable]" 키워드를 지정하여 Inspector에 노출시킬 수 있다. 

위와 같이 사용자 정의 클래스의 윗줄에 "[Serializable]" 키워드를 붙이고, Monobehaviour를 상속받고 있는 C# 스크립트의메인 클래스에서 해당 클래스의 객체를 생성하면, 아래와 같이 Inspector에 노출되어 값을 지정 할 수 있게 된다.

 


직렬화는 데이터 구조나 오브젝트 상태를 Unity 에디터가 저장하고 나중에 재구성할 수 있는 포맷으로 자동으로 변환하는 프로세스를 말한다.

Unity 에디터에서는 저장 및 로딩, 인스펙터 창, 인스턴스화, 프리팹과 같은 일부 내장 기능에 직렬화가 사용된다.

 

 

 

728x90