Unity Learn/주니어 프로그래머

6단원 - 프로젝트 최적화 : 직렬화

coding-potato 2024. 11. 26. 14:50

어트리뷰트

클래스, 메서드, 필드, 속성, 매개변수 등에 추가 정보를 제공하기 위해 사용하는 **메타데이터(metadata)**입니다. 어트리뷰트는 코드의 동작을 변경하거나 특정 기능을 활성화하는 데 도움을 줍니다.

어트리뷰트의 기본 개념

  • 정의: 어트리뷰트는 [ ] 안에 작성되며 클래스나 멤버 위에 적용됩니다.
  • 용도:
    1. 코드 실행 중에 특정 동작을 수행하거나
    2. 컴파일러나 런타임 환경에 정보를 전달

[SerializeField]

Unity에서 사용되는 **C# 어트리뷰트(attribute)**로, 비공개(Private) 필드를 인스펙터(Inspector) 창에 노출시키는 데 사용됩니다.

기본 개념

Unity에서 필드를 인스펙터 창에 노출시키려면 보통 public으로 선언해야 하지만, 모든 필드를 public으로 만드는 것은 캡슐화(encapsulation) 원칙을 위배할 수 있습니다.

[SerializeField]를 사용하면 필드는 여전히 private으로 유지하면서도 인스펙터 창에서 값을 설정할 수 있게 만듭니다.

사용 방법

위 코드의 동작

  1. privateValue: private임에도 불구하고 인스펙터 창에 나타납니다.
  2. hiddenValue: private이며, [SerializeField]가 없으므로 인스펙터에 나타나지 않습니다.
  3. publicValue: public 필드는 기본적으로 인스펙터에 표시됩니다.

[SerializeField]가 필요한 이유

  1. 캡슐화 유지: 데이터를 외부 스크립트에서 조작하지 못하게 보호.
  2. 인스펙터 창 활용: 디자이너나 비개발자도 쉽게 값을 설정하거나 조정할 수 있음.
  3. 코드 가독성 개선: 필드 접근 수준을 유지하면서 Unity의 직렬화(serialization) 기능을 활용.

[SerializeField]의 특징

  • 직렬화 가능한 데이터만 인스펙터 창에 표시됩니다. (예: int, float, string, Unity의 GameObject, Transform 등)
  • 기본값은 Unity 에디터에서만 저장됩니다. 실행 도중 변경된 값은 실행이 끝나면 초기화됩니다.
  • **배열(Array)**이나 **리스트(List)**에도 적용 가능합니다

주의 사항

  1. [SerializeField]는 private 필드에만 사용하는 것이 일반적입니다. public 필드는 기본적으로 직렬화되므로 굳이 사용할 필요가 없습니다.
  2. static 필드는 직렬화되지 않습니다.
  3. Unity에서 직렬화되지 않는 클래스(예: 사용자 정의 클래스)는 [System.Serializable] 어트리뷰트를 함께 사용해야 합니다.