내일배움캠프 47일차 TIL : JSON, summary, typeof

woollim·2024년 11월 28일
0

내일배움캠프TIL

목록 보기
40/65
post-thumbnail

■ 개요

오늘 계획

  • 오전 내 할일
    • 씬로더 씬 저장 경로 수정
    • 구글시트 수식수정, 구글시트스크립트 경로 수정
    • 구글시트스크립트 주석 추가
    • 데이터 클래스, SO 스크립트 이상한거 빼기 -> 딕셔너리 같은거
    • 데이터베이스 클래스 추가
    • enum 역직렬화 오류 확인
    • DataManager 완성
    • 데이터베이스 정규화
  • 이슈사항
    • UI프레임워크쪽 애니메이션, 경로지정 확인
    • 1920 * 1080 FullHD으로 결정
    • 데이터 시트 수식 빼기→ 수식으로 읽어옴
    • 스킬포인트 강화수치 따라감
      • 현재 스킬포인트 등급별 구분 -> 수정 필요
    • WeaponInfo 스크립트 내부 ID 규칙 정리 하면 좋을듯
      • 무기 종류별 타입 번호 ID
      • 옵션 코드 타입 번호 ID
    • Json Enum -> 변환문제 확인(0으로 변환 됨)


■ JSON

○ 기본 개념

  • JSON(JavaScript Object Notation)은 가볍고 사용하기 쉬운 데이터 표현 형식
  • 사람이 읽기 쉽고, 기계가 빠르게 파싱하고 생성할 수 있는 구조를 가지고 있음
  • 주로 웹 애플리케이션에서 서버와 클라이언트 간 데이터를 교환하는 데 사용됨

○ JSON의 주요 특징

  1. 키-값 쌍 구조:
  • 데이터는 키(key)와 값(value)으로 구성됨
{
    "name": "John",
    "age": 30,
    "isStudent": false
}

  1. 데이터 형식 지원: JSON은 다음과 같은 데이터 형식을 지원함
  • 문자열 (String): "text"
  • 숫자 (Number): 10, 3.14
  • 불리언 (Boolean): true, false
  • 배열 (Array): [1, 2, 3]
  • 객체 (Object): { "key": "value" }
  • 널 값 (null): null

  1. 구조적 계층화:
  • JSON은 중첩된 구조를 허용하여 복잡한 데이터 모델을 표현할 수 있음
{
    "person": {
        "name": "Alice",
        "contact": {
            "email": "alice@example.com",
            "phone": "123-456-7890"
        }
    }
}

  1. 언어 독립적:
  • JSON은 다양한 프로그래밍 언어에서 지원되며, 각 언어에 맞는 라이브러리를 통해 JSON 데이터를 쉽게 처리할 수 있음

○ Unity에서의 JSON

  • Unity에서 JSON은 주로 데이터를 직렬화(Serialization)하거나 역직렬화(Deserialization)하는 데 사용
  • Unity 프로젝트에서 데이터 저장, 전송, 로드 등의 작업에 매우 유용
  • JSON은 간결한 형식 덕분에 Unity의 다양한 컴포넌트와 잘 통합됨
  • 주요 사용 사례
    • 게임 데이터 저장:
      플레이어 설정, 스코어, 게임 진행 상황 등을 JSON으로 저장하여 파일로 관리하거나 클라우드에 업로드할 수 있음
    • 외부 데이터 로드:
      서버나 외부 API로부터 JSON 데이터를 받아와 게임에서 사용하는 데이터로 변환
    • 객체 직렬화:
      Unity의 ScriptableObject나 클래스 데이터를 JSON 형식으로 변환하여 저장 및 복원할 수 있음

○ Unity에서 JSON 사용 방법

Unity는 JSON 작업을 위해 JsonUtility 클래스를 기본 제공하며, 간단한 데이터 직렬화와 역직렬화를 처리할 수 있음

  1. 객체를 JSON으로 변환 (직렬화)
using UnityEngine;

[System.Serializable]
public class PlayerData 
{
    public string name;
    public int score;
}

public class JSONExample : MonoBehaviour 
{
    void Start() 
    {
        PlayerData player = new PlayerData {name = "Alice", score = 100};
        string jsonData = JsonUtility.ToJson(player);
        Debug.Log(jsonData); // {"name":"Alice","score":100}
    }
}
  1. JSON을 객체로 변환 (역직렬화)
using UnityEngine;

public class JSONExample : MonoBehaviour 
{
    void Start() 
    {
        string jsonData = "{\"name\":\"Alice\",\"score\":100}";
        PlayerData player = JsonUtility.FromJson<PlayerData>(jsonData);
        Debug.Log(player.name); // Alice
        Debug.Log(player.score); // 100
    }
}
  1. 복잡한 JSON 데이터 처리:
  • 중첩된 데이터 구조를 처리하려면 계층적 클래스를 정의
[System.Serializable]
public class Player 
{
    public string name;
    public int score;
    public Inventory inventory;
}

[System.Serializable]
public class Inventory 
{
    public string itemName;
    public int quantity;
}

string json = "{\"name\":\"John\",\"score\":100,\"inventory\":{\"itemName\":\"Sword\",\"quantity\":1}}";
Player player = JsonUtility.FromJson<Player>(json);
Debug.Log(player.inventory.itemName); // 출력: Sword
  1. List 및 배열 처리:
  • JsonUtility는 직접적으로 List를 지원하지 않으므로, 배열로 처리하거나 래퍼(wrapper) 클래스를 사용.
[System.Serializable]
public class Player 
{
    public string name;
    public int score;
}

[System.Serializable]
public class PlayerList 
{
    public Player[] players;
}

string json = "{\"players\":[{\"name\":\"John\",\"score\":100},{\"name\":\"Alice\",\"score\":200}]}";
PlayerList playerList = JsonUtility.FromJson<PlayerList>(json);
Debug.Log(playerList.players[0].name); // 출력: John

○ JsonUtility의 특징

  • 빠르고 효율적이지만 복잡한 구조에는 제한적
  • 예를 들어, 딕셔너리(Dictionary)와 같은 자료구조를 바로 처리할 수 없음
  • 복잡한 JSON 처리:
    JsonUtility는 단순한 JSON 처리에 적합하며, 복잡한 JSON 구조를 처리하려면 Newtonsoft.Json 같은 외부 라이브러리를 사용하는 것이 더 적합

○ Unity에서 JSON 활용 시 주의점

  1. System.Serializable 속성 필요:
    • JSON 변환 대상 클래스는 반드시 [System.Serializable]로 선언해야 함
  2. 속성 이름 일치:
    JSON 데이터의 키와 클래스 필드 이름이 정확히 일치해야 값이 매핑됨
  3. 복잡한 구조:
    배열, 리스트, 딕셔너리 등 복잡한 구조는 JsonUtility로 제한이 있을 수 있음

■ summary

  • C#에서 summary는 코드 주석의 XML 문서화 태그 중 하나로, 클래스, 메서드, 속성, 필드 등에 대한 설명을 작성하는 데 사용.
  • 이를 통해 코드에 대한 문서화가 쉬워지고, IDE에서 툴팁으로 표시되므로 코드 가독성과 유지보수성을 높이는 데 도움을 줌
  • Visual Studio에서는 메서드 위에서 ///를 입력하면 기본 XML 주석 구조가 자동으로 생성됨.
/// <summary>
/// 두 숫자의 합을 반환하는 메서드입니다.
/// </summary>
/// <param name="a">첫 번째 숫자</param>
/// <param name="b">두 번째 숫자</param>
/// <returns>두 숫자의 합</returns>
public int Add(int a, int b)
{
    return a + b;
}

○ 주요태그

  1. <summary> : 클래스, 메서드, 속성, 필드 등의 설명 작성.
/// <summary>
/// 사용자의 이름을 반환합니다.
/// </summary>
public string GetName() { ... }
  1. <param> : 메서드의 매개변수를 설명.
/// <param name="input">처리할 문자열</param>
  1. <returns> : 메서드가 반환하는 값을 설명.
/// <returns>문자열의 길이</returns>
  1. <remarks> : 추가적인 설명이나 주석.
/// <remarks>
/// 이 메서드는 대소문자를 구분하지 않습니다.
/// </remarks>
  1. <example> : 사용 예제 제공.
/// <example>
/// <code>
/// int result = Add(3, 5);
/// Console.WriteLine(result); // 8 출력
/// </code>
/// </example>
  1. <exception> : 메서드가 발생시킬 수 있는 예외 설명.
/// <exception cref="ArgumentNullException">
/// input이 null일 경우 예외 발생
/// </exception>


■ typeof

  • Unity에서 typeof는 C# 언어의 타입(type)을 나타내는 메타데이터를 가져오는 키워드
  • Unity에서는 주로 컴포넌트 타입, 스크립트 클래스 타입을 가져오거나 특정 타입의 오브젝트를 처리하는 데 사용

○ 기본 사용법

  • 타입 가져오기
    • typeof(MyClass)는 MyClass라는 클래스의 타입 정보를 반환
    • 반환되는 결과는 Type 객체로, 이를 통해 클래스에 대한 메타데이터를 확인하거나 타입 비교에 사용할 수 있음
Type type = typeof(MyClass);

○ Unity에서의 주요 사용 사례

  1. GetComponent와 함께 사용
  • typeof를 사용해 특정 컴포넌트를 동적으로 가져옴
  • typeof(Rigidbody)는 Rigidbody 컴포넌트의 타입 정보를 반환함
  • 이 방식은 제네릭 형식(GetComponent())이 나오기 전 자주 사용되었음
GameObject obj = new GameObject();
Rigidbody rb = (Rigidbody)obj.GetComponent(typeof(Rigidbody));

  1. EditorWindow와 함께 사용
  • Unity 에디터에서 특정 클래스 타입의 윈도우를 가져오거나 열 때 사용됨
EditorWindow.GetWindow(typeof(MyEditorWindow));
  // MyEditorWindow 타입의 에디터 윈도우를 생성하거나 반환

○ typeof와 GetType()의 차이점

  • typeof
    • 컴파일 시점에 타입을 가져옴
    • 주로 정적인 타입 정보 확인에 사용
    • 예: typeof(int), typeof(GameObject).
  • GetType()
    • 런타임에 객체의 타입을 반환
    • 객체가 없으면 사용할 수 없음
    • 예: myObject.GetType().

○ typeof를 사용할 때 주의점

  • 런타임 성능:
    typeof는 컴파일 타임에 타입을 확인하므로 성능에 큰 영향을 주지 않음
    하지만 Reflection과 조합할 경우 런타임 비용이 커질 수 있음
  • 타입 안전성:
    typeof는 잘못된 타입을 입력하면 컴파일러가 오류를 발생시킴. 이는 런타임에서 문제를 줄이는 데 도움이 됨

0개의 댓글