생성자에서 받는 인자 이름이 중요한가요?
슬라임마스터를 토대로 게임을 만들다가 궁금한점이 생겨서 질문드립니다.
아래는 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
Managers.Data.EquipData하는 부분에서 Breakpoint를 걸어보셨나요?
누군가가 답을 알려준다고 가정하지 말고
어떻게든 혼자 찾아보세요. 원래 개발이란 그런 것입니다.
0
라고 하려다 그냥 마지막으로 찾아드립니다.
breakpoint를 걸어 콜스택을 살펴보면
여기서 파생되어 생성자가 호출되고 있습니다.
이는 특이한 경우인데, Json 저장된 파일을 그대로 역직렬화하는 작업이기 때문입니다.
fileStr을 json으로 까보면, 아이템별로 데이터가 있는데
그 중에서 key라는 값이 보입니다.
따라서 일반 생성자 호출 문법이 아니라
역직렬화를 통해 객체가 만들어지는데
어느 타이밍에 생성자까지 호출되고 있습니다.
직렬화/역직렬화 할 때는 public 변수의 이름이랑 맞을 때
그것을 json 파일에서 읽어서 세팅해주기 때문에,
key라는 이름이 중요한 것이구요.
그 외에는 굳이 관심을 두실 필요 없습니다.
.NET Deserialize 관련 처리이기 떄문이죠.
0
ㅋㅋㅋ 이제 알겠네요 그야 key 라는 멤버 변수가 있으니 이름이 겹쳐서 그런 것이죠.
멤버 변수는 항상 _를 붙입니다 저의 경우.
0
정말 죄송한데 아직 해결이 안되었습니다 ㅠ
멤버변수명과 생성자의 인자명이 원래 슬라임 마스터에 key로 겹쳐있고 잘 작동합니다.
원래 프로젝트 파일대로 멤버변수명 = key , 매개변수명 = key 일때 문제없음
멤버변수명 = key, 매개변수명 = apple 일때 런타임 애러!
멤버변수명을 apple 로 변경 , 매개변수명 = key 일때 런타임 애러!
멤버변수명을 apple 로 변경, 매개변수명도 apple 로 변경했을때 런타임 애러!
멤버변수명과 매개변수명을 둘다 동일하게 key로 받아줘야만 애러가 발생을 안해요. 기존 프로젝트 파일에서 아무것도 건드리지 않고 잘 작동하는것을 확인 후 매개변수명만 바꿨는데 안되는게 이해가 잘 안갑니다. 시간 되실때 슬라임 마스터 프로젝트 Equipment 클래스의 34번줄 public Equipment 생성자의 string key 매개변수명만 한번 바꿔서 테스트 해주셨으면 감사하겠습니다. 불금에 귀찮게 해서 정말 죄송합니다!
0
전혀 상관 없습니다. 다른 문제일 것으로 보이는데요.
에러가 나는게 런타임 에러라는 것일까요?
0
네 맞습니다. 제가 만들고 있는 게임에서 위와 비슷한 문법에서 this.a = b 로 this의 변수명 a와 생성자에서 받는 인자 b의 이름을 다르게 했더니 런타임 에러가 발생하였습니다. 그래서 this.a = a 로 동일하게 맞추었더니 에러가 사라졌습니다. 제 생각에도 당연히 문제가 없어야 정상이고 너무 기본적인 질문인것 같아서 GPT를 활용하여 먼저 질문을 해보았는데 GPT도 문제가 없다고 하네요. 그래서 다시한번 슬라임마스터 프로젝트 파일을 새로 받아서 아무것도 건드리지 않고 위 스샷처럼 Equipment클래스의 Equipment 생성자의 인자명만 바꿔 게임을 실행해보니 에러가 발생합니다.
0


매개변수 이름만 바꿨을 뿐인데 위와같이 애러가 발생하고 시작할때 생성되는 장비를 불러오지 못합니다. 그런데 다시 매개변수 이름만 다시 key로 바꿔주면 잘됩니다 ㅠㅠ JSON에서 역직렬화 하는 과정에서 key라는 명칭을 그대로 받아줘야 하는 부분이 있는건가 추측하고 있는데 잘 못찾겠어요. 그러려니 하고 넘어가서 다른거 만들고 있긴하지만 여전히 의문이에요 ㅠ
Addressables로 등록한 Slice된 Sprite의 하위 Sprite 접근법에 대해 질문드립니다
0
85
1
유니티 데이터 저장객체 ScriptableObject에 대해 의견 여쭤보고 싶습니다
0
143
2
안녕하세요 선생님 공부중에 궁금한게 있어서 질문 드려요
0
65
1
상속 구조에서의 awake흐름 및 init 함수 질문있습니다
0
86
1
젬 스프라이트가 로딩되지 않습니다.
0
116
1
혹시 스프라이트 드래그 앤 드롭으로 애니메이션 생성할 때
0
122
1
init() 2번 실행? 등 스킬 마무리 강의에서 질문 있습니다.
0
169
2
Managers.Object.Player와 Mangers.Game.Player 차이
0
113
1
상업적 출시에 대한 질문입니다.
0
169
1
EquipmentData 관련해서 질문드립니다
0
117
1
Data관리 관련해서 질문드립니다.
0
171
2
MonsterControllelr 에서 State Dead 사용
0
107
1
안드로이드 빌드에서는 LoadAllAsync , LoadAsync 가 동작 하지 않고 있습니다.
0
241
2
Instantiate 관련 질문 드립니다
0
159
1
포트폴리오 문서작성에 있어서 질문드립니다.
0
600
2
UI 연동방식에 대해서 질문드립니다.
0
182
1
인디게임출시경험이 중요할까요?
1
346
1
Coroutine과 uniTask 질문드립니다.
0
240
1
ResourceManager 메서드 역할
0
221
1
스프라이트 자료
1
181
1
xml 에
0
269
2
UI 리소스 사용문의
0
270
1
폴더 이름 제일 앞에 @를 붙이는 이유가 궁굼해요
0
595
2
3.:43 초 때부터 잘 안되는 것 같습니다...
0
329
1





