TIL(2024,07,22)기술 면접 대비

김보근·2024년 7월 22일

Unity

목록 보기
44/113
post-thumbnail

기술 면접 대비

확인 문제

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

csharp
public class SomeClass : MonoBehaviour
{
[SerializeField] private int intValue = 2;

    private void Start()
		{
		    Debug.Log(intValue);
		}
}


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

csharp
private int intValue = 2;

이 때 Debug.Log(intValue);의 출력 결과는 어떻게 될까요?
  1. 이번에는 아래와 같이 코드를 작성하고 오브젝트에 작성한 스크립트 컴포넌트를 추가했습니다.

csharp
public class SomeClass : MonoBehaviour
{
public int intValue = 2;

    private void Start()
		{
		    Debug.Log(intValue);
		}
}


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

csharp
[HideInInspector] public int intValue = 2;

이 때 Debug.Log(intValue);의 출력 결과는 어떻게 될까요?
  1. 1번과 2번의 결과가 다른 이유가 무엇인가요?

답변

  1. [SerializeField]를 제거한 후 intValue의 출력 결과
    처음에 코드를 작성하고 인스펙터에서 intValue 값을 3으로 변경한 후 [SerializeField]를 제거했습니다.

초기 코드:

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

인스펙터에서 intValue 값을 3으로 변경:

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

이 경우 Debug.Log(intValue);의 출력 결과는 2입니다.

SerializeField를 제거하면 인스펙터에서 변경된 값이 더 이상 유지되지 않고, 스크립트에 선언된 기본값인 2가 사용됩니다.

  1. [HideInInspector]를 추가한 후 intValue의 출력 결과
    두 번째 예시에서는 처음에 인스펙터에서 intValue 값을 3으로 변경한 후 [HideInInspector]를 추가했습니다.

초기 코드:

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

인스펙터에서 intValue 값을 3으로 변경:

[HideInInspector] public int intValue = 2;
이 경우 Debug.Log(intValue);의 출력 결과는 3입니다.

HideInInspector는 인스펙터에서 해당 변수를 숨기지만, 값은 인스펙터에서 설정된 값을 유지합니다. 따라서 intValue는 3으로 설정된 상태로 유지됩니다.

  1. 결과가 다른 이유
    결과가 다른 이유는 두 가지 애트리뷰트의 작동 방식에 있습니다.

SerializeField: 이 애트리뷰트를 통해 프라이빗 변수를 인스펙터에서 설정할 수 있게 합니다. 그러나 이 애트리뷰트를 제거하면, 인스펙터에서 설정된 값이 아닌 기본값이 사용됩니다.

HideInInspector: 이 애트리뷰트를 통해 변수를 인스펙터에서 숨기지만, 인스펙터에서 설정된 값은 유지됩니다. 따라서, 인스펙터에서 설정된 값을 사용하게 됩니다.

1번에서는 SerializeField를 제거하여 기본값이 사용되었고, 2번에서는 HideInInspector를 사용하여 인스펙터에서 설정된 값이 유지된 것입니다.

설명문제

1. CSV/JSON 등 데이터 저장 포맷에 대해 설명하고, 활용에 적절한 상황을 설명해주세요.
2. 특정 데이터를 JSON으로 활용하기 위해 해야하는 작업은 무엇인가요?
3. Unity에서 필드를 직렬화하려면 어떻게 해야하는지 설명해주세요.

답변

  1. CSV/JSON 등 데이터 저장 포맷에 대해 설명하고, 활용에 적절한 상황을 설명해주세요.
    CSV (Comma-Separated Values)

CSV는 데이터를 쉼표로 구분하여 저장하는 단순한 파일 형식입니다.

장점:

  • 간단하고 이해하기 쉽습니다.
  • 대부분의 스프레드시트 프로그램 및 데이터베이스에서 쉽게 열 수 있습니다.
  • 파일 크기가 작고, 데이터 구조가 단순하여 빠르게 로드할 수 있습니다.

단점:

  • 중첩된 데이터나 복잡한 데이터 구조를 표현하기 어렵습니다.
  • 데이터 형식에 대한 메타데이터가 없어서 스키마를 파악하기 어렵습니다.

활용에 적절한 상황:

  • 간단한 테이블 형태의 데이터를 저장하고 공유할 때.
  • 스프레드시트 프로그램에서 데이터를 읽고 쓸 때.
  • 데이터베이스에서 간단한 데이터 덤프나 로드 작업을 할 때.

JSON (JavaScript Object Notation)

JSON은 데이터를 키-값 쌍으로 저장하는 포맷으로, 가볍고 사람이 읽기 쉬운 텍스트 형식입니다.

장점:

계층적 데이터 구조를 쉽게 표현할 수 있습니다.
많은 프로그래밍 언어와 쉽게 통합할 수 있습니다.
데이터를 직렬화하고 네트워크를 통해 전송하기에 적합합니다.

단점:

데이터 크기가 커질 수 있습니다.
이진 데이터 표현이 비효율적일 수 있습니다.

활용에 적절한 상황:

  • 웹 애플리케이션에서 서버와 클라이언트 간 데이터 교환 시.
  • RESTful API를 통해 데이터를 주고 받을 때.
  • 복잡한 데이터 구조를 저장하고 읽을 때.
  1. 특정 데이터를 JSON으로 활용하기 위해 해야하는 작업은 무엇인가요?
    특정 데이터를 JSON으로 활용하기 위해서는 다음과 같은 작업을 수행해야 합니다:

데이터 준비:

JSON으로 변환할 데이터를 준비합니다. 이 데이터는 객체, 배열, 숫자, 문자열 등 다양한 타입이 될 수 있습니다.

직렬화 (Serialization):

  • 데이터를 JSON 형식의 문자열로 변환합니다.
  • 다양한 프로그래밍 언어에서 JSON 직렬화를 지원하는 라이브러리나 함수를 사용합니다.
    예: Python의 json.dumps(), JavaScript의 JSON.stringify(), C#의 JsonConvert.SerializeObject().

전송 및 저장:

  • 직렬화된 JSON 문자열을 파일에 저장하거나 네트워크를 통해 전송합니다.
  • 파일로 저장할 때는 .json 확장자를 사용합니다.

역직렬화 (Deserialization):

  • JSON 문자열을 다시 원래의 데이터 구조로 변환합니다.
  • JSON을 파싱하여 프로그래밍 언어의 객체나 배열 등으로 변환합니다.

예: Python의 json.loads(), JavaScript의 JSON.parse(), C#의 JsonConvert.DeserializeObject().

  1. Unity에서 필드를 직렬화하려면 어떻게 해야하는지 설명해주세요.
    Unity에서 필드를 직렬화하려면 다음 방법들을 사용할 수 있습니다:

1.Public 필드:

필드를 public으로 선언하면 Unity의 인스펙터에서 자동으로 직렬화됩니다.

public int myValue;

2.[SerializeField] 속성:

private이나 protected 필드를 직렬화하고 싶을 때 사용합니다.

[SerializeField] private int myValue;
  1. [System.Serializable] 속성:

사용자 정의 클래스를 직렬화하려면 클래스에 이 속성을 추가합니다.

[System.Serializable]
public class MyClass
{
    public int myValue;
    public string myString;
}

4.지원되는 데이터 타입:

  • Unity는 기본적으로 int, float, string, bool, Vector2, Vector3, Color 등 다양한 기본 및 구조체 타입을 직렬화할 수 있습니다.

5.Property 대신 필드 사용:

  • Unity의 직렬화 시스템은 프로퍼티를 직렬화하지 않습니다. 따라서 직렬화할 데이터는 필드로 선언해야 합니다.

Unity에서 필드를 직렬화하면 인스펙터에서 해당 필드의 값을 설정하고 편집할 수 있으며, 게임 실행 중이나 저장 시 이 값들이 유지됩니다.

profile
게임개발자꿈나무

0개의 댓글