본문 바로가기
Unity

유니티에서 SerializeField 란 무엇인가요?

by Oz Driver 2025. 4. 20.

 

유니티를 보다보면 SerializeField 라는 키워드를 종종 접하게 됩니다.
또한 “이 변수는 직렬화되어야 인스펙터에 표시됩니다” 라는 설명도 흔히 들으실 수 있습니다.
처음에는 생소하지만, 직렬화라는 개념은 의외로 단순하며 유니티를 이해하는 데 꼭 필요한 기본 요소입니다.

 

직렬화란?

직렬화(Serialization) 란 데이터를 일렬로 쭉 줄 세우는 작업을 의미합니다.
우리가 만든 클래스나 객체는 사람에게는 정돈된 구조로 보일 수 있지만, 컴퓨터나 파일 시스템, 네트워크에는 그대로 전달할 수 없습니다.

그래서 객체 안의 데이터를 하나하나 꺼내어 연속된 형태로 변환하는 과정이 필요한데, 이것이 바로 직렬화입니다.
이 과정을 통해 비로소 저장하거나 전송할 수 있는 형태가 됩니다.

 

* 줄을 세우는 것 → 직렬화

* 다시 원래 형태로 되돌리는 것 → 역직렬화(Deserialization)

 

유니티에서 직렬화가 필요한 이유

유니티에서는 변수를 Inspector 창에 표시하기 위해 직렬화가 필요합니다.
직렬화되지 않은 변수는 Inspector 창에 보이지 않으며, 값이 저장되지도 않습니다.

즉, Inspector 를 통해 값을 조절하거나, 씬을 저장했을 때 값이 유지되길 원한다면 반드시 직렬화가 필요합니다.

 

어떤 변수가 직렬화되나요?

다음과 같은 경우 변수는 유니티에서 직렬화되어 Inspector 에 표시됩니다

* public 변수는 자동으로 직렬화됩니다.

* private 변수는 [SerializeField] 속성을 붙이면 직렬화됩니다.

* 단, 직렬화 가능한 타입이어야 합니다.

 

예 : int, float, string, Vector3, Color, Transform 등

사용자 정의 클래스나 구조체는 [System.Serializable] 을 명시해야 합니다.

 

예시로 살펴보기

public class PlayerData : MonoBehaviour
{
    // ✅ 인스펙터에 표시됨
    public int health = 100;                     
    
    // ✅ 인스펙터에 표시됨
    [SerializeField] 
    private float speed = 5.0f; 
    
    // ❌ 인스펙터에 표시되지 않음
    private bool isDead = false;                 
}

 

* health는 public 변수이므로 자동으로 직렬화됩니다.

* speed는 private이지만 [SerializeField]를 사용했기 때문에 직렬화되어 Inspector  창에 표시됩니다.

* isDead는 private이며 직렬화되지 않았기 때문에 Inspector 창에서 확인할 수 없습니다.

 

마무리

* 직렬화는 데이터를 줄 세워 저장하거나 전송할 수 있도록 만드는 기술입니다.

* 유니티에서는 Inspector 창에서 변수를 보여주기 위해 직렬화가 필요합니다.

* SerializeField 는 private 변수에도 직렬화를 적용할 수 있도록 도와주는 속성입니다.

 

 

추가로 ...

유니티에서는 인스펙터에 한 번이라도 값이 저장되면, 그 이후로는 스크립트에서 설정한 초기값(= 100 같은 값)은 더 이상 적용되지 않습니다.
그렇다면, 굳이 변수에 초기값을 지정할 필요가 없는 걸까요?

꼭 그렇지는 않습니다.

 

스크립트에서 초기값을 지정해두면, 컴포넌트를 처음 추가할 때 인스펙터에 자동으로 들어갈 기본값이 되기 때문에 작업의 시작 지점을 미리 정해주는 용도로 유용하게 쓸 수 있습니다.

즉, 초기화는 “처음 한 번” 을 위한 값이며, 이후 값의 유지나 조정은 대부분 인스펙터를 통해 이루어집니다.