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

vpncities님의 프로필 이미지
vpncities

작성한 질문수

[라이브 멘토링] 유니티 뱀파이어 서바이벌 장르 모작

UI 하위 아이템

생성자에서 받는 인자 이름이 중요한가요?

해결된 질문

작성

·

292

0

슬라임마스터를 토대로 게임을 만들다가 궁금한점이 생겨서 질문드립니다.

아래는 Equipment 클래스의 생성자 부분입니다.

public Equipment(string key)
    {
        this.key = key;

        EquipmentData = Managers.Data.EquipDataDic[key];

        SetInfo(Level);
        IsOwned = true;
    }

인자로 받는 string key 이름을 아래와 같이 임의대로 지었더니 ArgumentNullException 애러가 발생합니다.

public Equipment(string apple)
    {
        this.key = apple;

        EquipmentData = Managers.Data.EquipDataDic[apple];

        SetInfo(Level);
        IsOwned = true;
    }

그저 변수 이름을 바꿨을 뿐인데 왜 애러가 발생하는지 잘 모르겠습니다.

답변 3

1

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

Managers.Data.EquipData하는 부분에서 Breakpoint를 걸어보셨나요?
누군가가 답을 알려준다고 가정하지 말고
어떻게든 혼자 찾아보세요. 원래 개발이란 그런 것입니다.

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

라고 하려다 그냥 마지막으로 찾아드립니다.

breakpoint를 걸어 콜스택을 살펴보면
image여기서 파생되어 생성자가 호출되고 있습니다.
이는 특이한 경우인데, Json 저장된 파일을 그대로 역직렬화하는 작업이기 때문입니다.
imagefileStr을 json으로 까보면, 아이템별로 데이터가 있는데
그 중에서 key라는 값이 보입니다.

따라서 일반 생성자 호출 문법이 아니라
역직렬화를 통해 객체가 만들어지는데
어느 타이밍에 생성자까지 호출되고 있습니다.
image
직렬화/역직렬화 할 때는 public 변수의 이름이랑 맞을 때
그것을 json 파일에서 읽어서 세팅해주기 때문에,
key라는 이름이 중요한 것이구요.

그 외에는 굳이 관심을 두실 필요 없습니다.
.NET Deserialize 관련 처리이기 떄문이죠.

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

궁금증이 풀렸습니다. 혼자서는 못찾았을것 같아요. fileStr을 열어볼 생각을 못했어요. 감사합니다! 좋은 주말 보내세요!!

0

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

ㅋㅋㅋ 이제 알겠네요 그야 key 라는 멤버 변수가 있으니 이름이 겹쳐서 그런 것이죠.
멤버 변수는 항상 _를 붙입니다 저의 경우.

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

정말 죄송한데 아직 해결이 안되었습니다 ㅠ

멤버변수명과 생성자의 인자명이 원래 슬라임 마스터에 key로 겹쳐있고 잘 작동합니다.

 

  1. 원래 프로젝트 파일대로 멤버변수명 = key , 매개변수명 = key 일때 문제없음

  2. 멤버변수명 = key, 매개변수명 = apple 일때 런타임 애러!

  3. 멤버변수명을 apple 로 변경 , 매개변수명 = key 일때 런타임 애러!

  4. 멤버변수명을 apple 로 변경, 매개변수명도 apple 로 변경했을때 런타임 애러!

     

     

    멤버변수명과 매개변수명을 둘다 동일하게 key로 받아줘야만 애러가 발생을 안해요. 기존 프로젝트 파일에서 아무것도 건드리지 않고 잘 작동하는것을 확인 후 매개변수명만 바꿨는데 안되는게 이해가 잘 안갑니다. 시간 되실때 슬라임 마스터 프로젝트 Equipment 클래스의 34번줄 public Equipment 생성자의 string key 매개변수명만 한번 바꿔서 테스트 해주셨으면 감사하겠습니다. 불금에 귀찮게 해서 정말 죄송합니다!

     

     

0

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

전혀 상관 없습니다. 다른 문제일 것으로 보이는데요.
에러가 나는게 런타임 에러라는 것일까요?

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

네 맞습니다. 제가 만들고 있는 게임에서 위와 비슷한 문법에서 this.a = b 로 this의 변수명 a와 생성자에서 받는 인자 b의 이름을 다르게 했더니 런타임 에러가 발생하였습니다. 그래서 this.a = a 로 동일하게 맞추었더니 에러가 사라졌습니다. 제 생각에도 당연히 문제가 없어야 정상이고 너무 기본적인 질문인것 같아서 GPT를 활용하여 먼저 질문을 해보았는데 GPT도 문제가 없다고 하네요. 그래서 다시한번 슬라임마스터 프로젝트 파일을 새로 받아서 아무것도 건드리지 않고 위 스샷처럼 Equipment클래스의 Equipment 생성자의 인자명만 바꿔 게임을 실행해보니 에러가 발생합니다.

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

image

image

매개변수 이름만 바꿨을 뿐인데 위와같이 애러가 발생하고 시작할때 생성되는 장비를 불러오지 못합니다. 그런데 다시 매개변수 이름만 다시 key로 바꿔주면 잘됩니다 ㅠㅠ JSON에서 역직렬화 하는 과정에서 key라는 명칭을 그대로 받아줘야 하는 부분이 있는건가 추측하고 있는데 잘 못찾겠어요. 그러려니 하고 넘어가서 다른거 만들고 있긴하지만 여전히 의문이에요 ㅠ

vpncities님의 프로필 이미지
vpncities

작성한 질문수

질문하기