Deff_Dev

[Unity] JSON과 직렬화 본문

면접 질문 정리/Unity

[Unity] JSON과 직렬화

Deff_a 2024. 7. 22. 10:43

 

1. 아래와 같이 코드를 작성하고 오브젝트에 작성한 스크립트 컴포넌트를 추가했습니다.

public class SomeClass : MonoBehaviour
{
    [SerializeField] private int intValue = 2;
    
    private void Start()
		{
		    Debug.Log(intValue);
		}
}

 

인스펙터에서 intValue의 값을 3으로 변경하고, intValue 앞에 선언된 [SerializeField]를 제거했습니다.

private int intValue = 2;

 

이 때 Debug.Log(intValue);의 출력 결과는 어떻게 될까요?

 

2가 출력된다.

  • SerializeField는 직렬화되지 않은 해당 private 변수를 직렬화하여 인스펙터 창에 표시하여 값을 확인하거나 바꿀 수 있도록 한다.
  • 이때, SerializeField를 지운다면 해당 변수는 직렬화되지 않으며, 인스펙터에 수정한 값은 무시되고 기존에 정의된 기본 2가 출력된다.
  • 하지만 다시 SerializeField를 붙힌다면 3이 출력된다.

2. 이번에는 아래와 같이 코드를 작성하고 오브젝트에 작성한 스크립트 컴포넌트를 추가했습니다.

public class SomeClass : MonoBehaviour
{
    public int intValue = 2;
    
    private void Start()
   {
	Debug.Log(intValue);
   }
}

 

인스펙터에서 intValue의 값을 3으로 변경하고, intValue 앞에 [HideInInspector]를 추가했습니다.

 

[HideInInspector] public int intValue = 2;

 

이 때 Debug.Log(intValue);의 출력 결과는 어떻게 될까요?

 

3이 출력된다.

  • HideInInspector 속성은 변수의 값을 인스펙터에서 숨기지만, 변수는 여전히 직렬화된다.
  • 따라서 인스펙터에서 설정된 값 3은 유지되고, Start 메서드에서 이 값이 출력된다.

3. 1번과 2번의 결과가 다른 이유가 무엇인가요?

  • 기본적으로 private은 직렬화가 안되어서 인스펙터 창에 보이지 않지만, SerializeField를 사용하여 직렬화하여 인스펙터 창에 보이게 하기 때문에 SerializeField가 사라진다면 직렬화도 사라져 값이 초기화된다.
  • public은 기본적으로 직렬화가 되어져 있기 때문에 HideInInspector 를 붙히더라도 수정된 값은 초기화되지 않는다.

 

4. CSV/JSON 등 데이터 저장 포맷에 대해 설명하고, 활용에 적절한 상황을 설명해주세요

  • CSV
    • 저장된 모든 데이터를 , 로 구분하여 저장한다.
    • 모든 데이터가 , 로 구분되어져 있다보니, 데이터를 확인하기 어렵고, 리스트와 딕셔너리 같이 복잡한 데이터 구조는 저장하고 불러오기가 까다롭다.
    • 간단한 데이터 포맷으로 처리 속도가 JSON보다 빠르다.
    • 주로 간단한 테이블 데이터를 처리하거나, 빠른 읽기/쓰기 성능이 필요할 때, 사용한다.
  • JSON
    • Key, Value 형식으로 되어져 있는 데이터 저장 포맷으로 리스트, 딕셔너리와 같이 복잡한 데이터 형태도 쉽게 저장하고 불러올 수 있다.
    • Key, Value 형식으로 되어져 있다 보니 데이터를 확인하기 편하다.
    • 웹, 애플리케이션, 네트워크 등 호환성이 뛰어나다.
    • 데이터를 저장하는 과정이 CSV보다 느립니다.
    • 키-값 쌍 구조로 인해 저장 공간이 더 많이 필요할 수 있습니다.

5. 특정 데이터를 JSON으로 활용하기 위해 해야하는 작업은 무엇인가요?

  • 직렬화 : 객체를 JSON 형식의 문자열로 변환하는 과정
  • 역직렬화 : JSON 문자열을 다시 객체로 변환하는 과정
  • 파일입출력 : JSON 문자열을 파일에 저장하고, 파일에서 JSON 문자열을 읽어오는 작업

6. Unity에서 필드를 직렬화하려면 어떻게 해야하는지 설명해주세요.

  • 기본 데이터 타입 직렬화:
    • 필드를 public으로 선언하거나 private 필드에 [SerializeField] 속성을 붙다
  • 클래스 직렬화
    • 클래스를 직렬화하려면 클래스 정의에 [Serializable] 속성을 붙인다.
  • 프로퍼티 직렬화
    • C#의 자동 구현 속성을 직렬화하려면 [field: SerializeField] 속성을 붙인다.

'면접 질문 정리 > Unity' 카테고리의 다른 글

[Unity] 게임 수학  (0) 2024.07.27
[Unity] 최적화  (1) 2024.07.17
[Unity] 코루틴  (1) 2024.07.16
[Unity] MonoBehavior와 Unity 생명주기  (0) 2024.07.15