인프런 커뮤니티 질문&답변

starkshn님의 프로필 이미지

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진

Data Manager #2

강의 11:00까지 이해한부분(조금 길어용)

21.11.22 16:38 작성

·

368

1

현재

[Serializable] 필드 두개로 StatData, Stat을 Json파일과 형식을 똑같이 맞춰주는 부분이고

StatData는 ILoader<int, Stat>을 상속받는 아이여야 한다. 라는 부분이다.

현재 ILoader인터페이스를 상속받고있으니

Dictionary<Key, Value> MakeDict() 이부분을 반드시 구현해야한다.

그래서 StatData에서

public List<Stat> stats = new List<Stat>();으로 빈 List를 만들고

public Dictionary<int, Stat> MakeDict() 인터페이스를 구현을 하는 부분인데

{

// 안에서

Dictionary<int ,Stat> dict = new Dictionary<int, Stat>(); int를 Key, Stat을 Value로 가지는

Dict 만들어주고

foreach를 통해서 dict의 Key값에는 stat.level을 value에는 stat을 dict.Add로 추가를 해주는 것을 구현을 하였다

}

그리고

DataManager class에서는

public Dictionary<int, Stat> StatDict { get; private set; } = new Dictionary<int, Stat>();

int를 Key로 Stat을 Value로 받는 Dict를 StatDict라고 선언을 했다

(근데 왜 얘만 { get; private set; }으로 한것인지?)

그리고 Loader타입을 반환하는 LoadJson함수를 만들었는데

LoadJson함수는 타입을<Loader, Key, Value>를 받고 인자로 string path 경로를 받게하였다.

근데 Loader라는 타입은 ILoader를 무조건 상속받는데 ILoader가 타입이 <Key, Value>인것 아무거나라도 괜찮은 Loader를 받는 다는 의미이다!!

이까지 코드분석은 된거같고

!!문제!!는

init()함수에서 int를 Key, Stat을 Value로 받는 StatDict인데

StatDict는 LoadJson에 타입을<StatData, int , Stat>을 받고 인자로는 "StatData"(경로)를 넣어주었다.

그러면 StatData LoadJson<StatData, int, Stat>("StatData") where StatData : ILoader<int, Stat>

함수를 호출하고 .MakeDict();를 한것이 StatDict에 할당이 된다는 뜻까지는 Okay!

그러면 호출 순서가

  1. TextAsset textAsset = Managers.Resource.Load<TextAsset>("Data/StatData"); 먼저실행

    textAsset에 경로를 넣어준 파일 할당

  2. JsonUtility.FromJson<StatData>(textAsset.text);를 통해 StatData타입으로 textAsset.text를 파싱한것을 return 해준다.

그러면

LoadJson<StatData, int, Stat>("StatData")이부분까지는 위의 호출 순서대로 return을 해준것은 StatData 클래스 타입으로 textAsset.text를 파싱한것인데,

StatData클래스는 ILodaer<int, Stat>을 상속받았기 때문에

MakeDict()라는 함수를 가지고있어서

StatDict = LoadJson<StatData, int, Stat>("StatData").MakeDict();

가 가능한것이고

StatData의 MakeDict함수를 써주었기 때문에 결국에는

dict가 반환이 되는데 이것이

dict를 DataManager 39번째 줄에 선언을 해주었던 StatDict 딕셔너리에 할당을 해주는것이 된다.

 

1. 이렇게 정리하면서 공부했는데

위에 제가 혼자 정리한것이,

제가 이해한것이 맞나요??

 

2. 이런식으로 코딩을 정리하는 습관이 유니티,씨샵을 공부하면서 효과적인 정리일까요??

 

3. DataManager클래스 안에서 

public Dictionary<int, Stat> StatDict { get; private set; } = new Dictionary<int, Stat>();

이부분만 왜 { get; private set; }으로 만든것인가요?

public Dictionary<int, Stat> StatDict  = new Dictionary<int, Stat>();

이렇게 선언한것이랑 차이가 무엇인가요??

 

4. 함수나 딕셔너리에서 < > 안에 타입을 넣어주시는데 이것이

int, string 같은 변수의 진짜 타입을 넣어 줄 수도 있는것이고class형식이다라는 것도< > 안에 넣어 주어서

public void init()

    {

        StatDict = LoadJson<StatData, int, Stat>("StatData").MakeDict();

    }

처럼 LoadJson<StatData, int, Stat>을 넣어 주었기때문에

StatData를 < > 안에 "class형식이다" 라고 넣어줘서 StatData안에 MakeDict함수를 .MakeDict()로 사용이 가능한것인가요?

 

답변 1

2

Rookiss님의 프로필 이미지
Rookiss
지식공유자

2021. 11. 22. 20:11

질문이 너무 디테일에 집중되어 있습니다.
프로그래밍은 영문법처럼 정해진 것이 있는게 아니라
그냥 자유롭게 만들면 되고 세세한 문법에 전혀 신경쓸 이유가 없습니다.
외부에서 StatDict를 교체할 일이 없으니 private set;으로 했지만,
StaticDict = new ... 로 한다고 딱히 뭐가 기능적으로 문제가 있는 것은 아닙니다.

공부 방법 또한 개인에 맞는 방법을 찾으시면 되고
혼자 정리하는 것을 좋아하는 사람도 있고 싫어하는 사람도 있어
어느 쪽이 낫다고 할 수 없습니다.

MakeDict()를 사용할 수 있는 이유는
where Loader : ILoader<>... 부분 떄문입니다.
ILoader 인터페이스는 MakeDict()를 갖고 있다고 정의를 했기 때문이죠.

~제가 이해한 것이 맞나요?
~이거와 이거는 무슨 차이가 있나요?
위 두 부류의 질문은 어차피 앞으로 책을 보거나 독학하다보면
늘 생기기 마련이고, 누군가가 답해줄 사람은 없는 상황이 대부분일겁니다.
팁을 느리자면, 그냥 본인이 어떤 가설을 세우고 (이래서이지 않을까?)
넘어가면 되고 당장은 디테일에 너무 신경쓸 필요가 없습니다.
왜냐하면 정말 그 가설이 잘못 되었다면,
언젠가 공부하다가 모순이 생기게 될테고 그렇게 또 경험치가 쌓이기 때문입니다.

starkshn님의 프로필 이미지
starkshn
질문자

2021. 11. 22. 21:02

답변 감사합니다~

starkshn님의 프로필 이미지

작성한 질문수

질문하기