나 개발자 진짜 되냐?

[ 12月 17日 ] 오늘 내가 배운 것 _ 66日次 _ 튜터님은 츤데레👏 본문

오늘 공부를 정리해봐요!

[ 12月 17日 ] 오늘 내가 배운 것 _ 66日次 _ 튜터님은 츤데레👏

Snow Rabbit 2024. 12. 17. 23:26
반응형

 

 

오늘은

튜터님과 오오오오 오랜 시간 함께하며

나의 숭숭 뚫린 실력구멍이

드러나 부렸다..

 

모르는 게 너무 많았고..

.. 부족한 게 많았다.

 

코드 관련 질문에 대해

한마디도 못했다.

 

모르는 코드를 쓰고 있다는 말씀에

.. 마음이 울적했다.

 

한창 혼나고

마지막에 제 안부를 걱정해 주셔서

너무 감동받아서 훌쩍였다.

 

지 선생의 도움은 이래서 너무 많이 받으면 안 된다.

 

지 선생의 코드와

오늘 내가 고친 코드를 비교해 보는 시간을 가져보자..!

 

지 선생이 짜준 코드이다.

using UnityEngine;

public class DataManager : Singleton<DataManager>
{
    public ItemDataList ItemDB => itemData_List ??= LoadData<ItemDataList, MetaItemDataList>(
        "Item", 
        data => itemData_List.SetData(data.Item)
    );

    public MonsterDataList MonsterDB => monsterDataList ??= LoadData<MonsterDataList, MonsterDataList>(
        "MonsterData", 
        data => monsterDataList.SetData(data.MonsterData)
    );

    public PlayerDataList PlayerDB => playerDataList ??= LoadData<PlayerDataList, PlayerDataList>(
        "Player", 
        data => playerDataList.SetData(data.Player)
    );

    public DungeonDataList DungeonDB => dungeonDataList ??= LoadData<DungeonDataList, DungeonDataList>(
        "Dungeon", 
        data => dungeonDataList.SetData(data.Dungeon)
    );

    protected override void Awake()
    {
        base.Awake();
        Debug.Log("DataManager Awake 호출됨");
        LoadAllData();
    }

    private void LoadAllData()
    {
        Debug.Log("모든 데이터 로드 시작");

        // 각 데이터 프로퍼티에 접근하여 데이터 로드 실행
        var items = ItemDB;
        var monsters = MonsterDB;
        var players = PlayerDB;
        var dungeons = DungeonDB;

        Debug.Log("모든 데이터 로드 완료");
    }

    // 제너릭 메서드: JSON 데이터 로드 및 변환
    private T LoadData<T, M>(string resourceKey, System.Action<M> customAction = null) where T : new()
    {
        TextAsset data = ResourceManager.Instance.LoadAsset<TextAsset>(resourceKey, eAssetType.JsonData);
        if (data != null)
        {
            Debug.Log($"JSON 파일 로드 성공: {resourceKey}");
            M MetaDataList = JsonUtility.FromJson<M>(data.text);

            if (MetaDataList == null)
            {
                Debug.LogError($"JSON 파싱 실패: {resourceKey}");
                return new T();
            }

            customAction?.Invoke(MetaDataList);
            return (T)(object)MetaDataList;
        }
        else
        {
            Debug.LogError($"{resourceKey} 데이터 불러오기 실패");
            return new T();
        }
    }
}

 

 

여기서 람다가 또! 쓰이는데

보는 건 쉬운데 또 활용하는 게 굉장히 어렵다.

 

 

??=

이 친구가 누구냐!

 

널이면 실행해라

라는 뜻

 

근데 이렇게 해주니 문제가 매우 많이 발생했다.

 

1. 초기화를 안 해주었다.

 

2. 초기화를 해주면 널값이 아니기 때문에 뒷부분이 실행 안된다.

 

그래서 심각한 문제 발생

 

 

밑에도 문제가 있다.

 

 

너무나 당당하게 델리게이트를 썼다.

하지만 이건 정말 나의 큰 실수였다.

 

잘 모르면서 써서 호되게 혼나 부렸다.

 

여기의 문제 

 

3. return new T는 순서가 엇갈린다.

초기화가 여기 있으면 매우 논란쓰

 

이래저래 고쳐보았다.

using UnityEngine;

public class DataManager : Singleton<DataManager>
{
    private ItemDataList itemDataList;
    public ItemDataList ItemDB => itemDataList ??= LoadData<ItemDataList, MetaItemDataList>("Item", data => 
    {
        itemDataList = new ItemDataList();
        itemDataList.SetData(data.Item);
        return itemDataList;
    });

    private MonsterDataList monsterDataList;
    public MonsterDataList MonsterDB => monsterDataList ??= LoadData<MonsterDataList, MonsterDataList>("MonsterData", data => 
    {
        monsterDataList = new MonsterDataList();
        monsterDataList.SetData(data.MonsterData);
        return monsterDataList;

    });

    private PlayerDataList playerDataList;
    public PlayerDataList PlayerDB => playerDataList ??= LoadData<PlayerDataList, PlayerDataList>("Player", data => 
    {
        playerDataList = new PlayerDataList();
        playerDataList.SetData(data.Player);
        return playerDataList;
    });

    private DungeonDataList dungeonDataList;
    public DungeonDataList DungeonDB => dungeonDataList ??= LoadData<DungeonDataList, DungeonDataList>("Dungeon", data =>
    {
        dungeonDataList = new DungeonDataList();
        dungeonDataList.SetData(data.Dungeon);
        return dungeonDataList;
    });

    protected override void Awake()
    {
        base.Awake();
        Debug.Log("DataManager Awake 호출됨");
        LoadAllData();
    }

    private void LoadAllData()
    {
        Debug.Log("모든 데이터 로드 시작");

        // 각 데이터 프로퍼티에 접근하여 데이터 로드 실행
        var items = ItemDB;
        var monsters = MonsterDB;
        var players = PlayerDB;
        var dungeons = DungeonDB;

        Debug.Log("모든 데이터 로드 완료");
    }


    // 제너릭 메서드: JSON 데이터 로드 및 변환
    private T LoadData<T,M>(string resourceKey, System.Func<M,T> customAction = null) where T : new()
    {
        TextAsset data = ResourceManager.Instance.LoadAsset<TextAsset>(resourceKey, eAssetType.JsonData);
        if (data != null)
        {
            Debug.Log($"JSON 파일 로드 성공: {resourceKey}");
            M MetaDataList = JsonUtility.FromJson<M>(data.text);
            var loadData = customAction.Invoke(MetaDataList);
            return loadData;
        }
        else
        {
            Debug.LogError($"{resourceKey} 데이터 불러오기 실패");
            return default;
        }
    }
}

 

고치고 나서 코드이다!

 

한 시간 반동안

튜터님 자리에서

많이 배웠다.

 

 

1. 아까 코드에서 초기화를 람다 안에 넣어주었다.

 

람다.. 늘 들어도 어렵다.

 

그리고 그 데이터리스트들을 리턴해주었다.

 

리턴을 해주니 문제가 생겼다.

 

Action은 리턴을 해줄 수 없는 친구..!

그래서 우리는

새로운 친구

 

 

Func를 사용했다.

 

이 친구는 리턴이 가능하여

로드 데이터가 가능해졌다.

 

코드 고치는 게

가장 어려울지도 모르겠다.

반응형