
Debugging사실 3에서 같이 했어야했지만 프로젝트가 끝나고 바로 기절해버려서 버그 정리를 따로 올리게 되었다. 기억 상 20개 정도 되는 것 같은데 커밋 기준으로 작성해보려한다.
bug #1
Player.Instance null
Player class를 싱글톤으로 구현해놓고 첫 instance 생성 함수를 만들지 않아서 instance가 null로 진행되는 상황
싱글톤 패턴에서 class 내부에 Player.GetInstance를 만들어 첫 번째 호출 전에 GetInstance를 통해 instance 생성을 해야한다.
public static void GetInstance()
{
if (instance == null)
{
instance = new Player();
}
}
이후 GameManager.Start() 에 Player.GetInstance(); 추가하여 해결
bug #2,3
Player._obj = null
GameObject can't have an instance
GameObject를 추상 클래스로 만들어놓고 Player 클래스에 GameObject _obj를 만들어서 생긴 문제. 추상 클래스는 인스턴스를 가질 수 없다.
2가지 방법으로 해결할 수 있었는데 하나는 상속, 하나는 필드 추가이다.
1. Player가 GameObject를 상속
2. _obj를 없애고 symbol, color 필드를 선언
이 중 2번째 방식으로 진행하여, 신규 필드를 만들어 해결
→ 지금 생각하면 상속이 가장 좋은 방법이었을 것 같다. Player.Action을 Player.Interact로 바꾸고 상속을 했다면, 조금 더 깔끔한 코드가 되지 않았을까?
bug #4
Player._Position null
_Position이 Vector의 인스턴스인데 구조체가 아닌 클래스로 만들어 생긴 문제
이때는 클래스로 만들었다는 사실도 눈치 못채고 단순히 Player 생성자에 new Vector()로 초기화를 진행하여 해결. 이때 눈치 못 챈게 정말 레전드
bug #5
Map Range exception
Map을 배열로 만들어놓고 가장자리를 벽으로 막아놓지 않아, 플레이어가 Map 밖으로 나갈 때 배열 index를 넘어가서 생긴 문제
가장자리에 벽을 두르는 것으로 해결
bug #6플레이어가 벽을 통과하는 이슈
bug #4와 똑같이 Vector를 구조체가 아닌 클래스로 선언하여 인스턴스를 참조한 뒤 계속해서 원본 값이 수정되서 생긴 문제
Vector를 클래스가 아닌 구조체로 선언하여 해결
→ 강사님이 몇 번이나 강조했는데 끝까지 눈치 못 채고 결국 강사님께 헬프 요청한게 레전드. 덕분에 강사님이 웃으시긴 했다.
bug #7필드로 이동 시 플레이어 스폰 위치가 동일한 이슈
이전 필드에 따라 스폰 위치를 다르게 해야하는데 동일한 좌표값을 사용하여 생긴 문제
Player 클래스가 현재 위치만 필드로 가지고 있었는데, 이전 위치와 다음 위치를 추가하여 이전 위치에 따라 스폰 좌표값을 다르게 설정하여 해결
bug #8
Util.PrintTriangle Range exception
선택지에서 삼각형이 출력되도록 하는 함수에서 if 조건의 부등호를 반대로 설정해놔서 삼각형이 선택지 범위 밖으로 나가는 문제
if 조건 부등호 방향을 수정하여 해결 → 논리 연산자 공부 열심히 하자!
bug #9
Computer instance null
Computer.GetInstance를 Computer.Instance.GetInstance로 작성해서 생긴 문제.
Computer.GetInstance로 수정 → 첫 Instance 생성 주의!!!
bug #10Coin의 가격 변동이 안되는 현상
_price = (int)((1 + change/100) * _price);에서 change를 rnd.Next(-50,50)으로 설정하여 change/100이 0으로 계산되서 생긴 문제
_price = (int)((1 + (float)change/100) * _price); 로 수정하여 해결
bug #11플레이어의 코인 인벤토리에 저장되어있는 코인의 수량 변경 불가
Player 클래스에 list<Coin>으로 선언한 coinInven에 저장되어있는 coinInven[0].count를 Computer 클래스 내부에서 변경할 수 없어 생기는 문제. → indexer access returns temporary value
bug #11의 경우 아직도 원인을 찾지 못하였다. 해당 오류가 생기는 이유를 알 수 없어 일단 Player가 가지고 있는 coinInven을 삭제하고 Computer 내부에 선언한 Coin[]의 값을 변경하여 해결했다.
→ Coin을 구조체로 선언한게 문제였을까? class로 선언하여 참조 형식으로 진행했다면 됐었을까?
bug #12
Util.PrintSideTriangle Range exception
트레이드 화면에서 잘못된 방향키를 눌렀을 때 Range exception 뜨는 문제
Util.PrintSideTriangle을 사용하는 메서드의 decision 값을 0이 아닌 출력하고자 하는 선택지 중 첫 번째 좌표값으로 변경하여 해결.
→ bug #12의 경우 재현을 하려고 똑같이 눌렀는데도 제대로 실행되어 원인을 제대로 파악하기 힘들었다. 결국 decision의 잘못된 초기화 값을 수정하고 기도했다.
bug #13맵이 스크린과 겹치는 현상
만들어놓은 맵도 CursorPosition(0,0)에서 시작하고 스크린도 CursorPosition(0,0)에서 시작하여 렌더링이 겹치는 문제.
맵을 출력할 때 CursorPosition(26,1) 로 변경하여 해결
bug #14
Util.TriForNum Range exception
TriForNum 내부 if 조건의 범위를 매개변수 값을 사용하지 않고 설정하여 더 큰 값이 인덱스에 할당되어 배열의 크기를 벗어나 생기는 문제
number[decision - 1]을 number[decision - left]로 수정하여 해결
bug #15
Creditor.Fulfill에서 빚이 점점 불어나는 현상
참조하는 배열 TransPay의 연속 사용으로 중복 연산이 되어 발생하는 문제
int pay = TransPay(); 로 값에 할당하여 pay를 매개변수로 넣음으로 중복 연산이 생기지 않도록 했다.
bug #16Lottery에서 Enter키 2번 연속으로 누르면 나가지는 현상
선택지가 뜨기 전에 Enter키가 미리 입력되면 ConsoleKey값이 Enter로 설정되는데, 이 경우 while문에 진입하지 않아 바로 초기 decision을 반환하여 생기는 문제.
decision의 초기값을 0이 아닌 출력하고자 하는 선택지 중 첫 번째 좌표값으로 변경하여 해결.
→ do-while문으로도 해결할 수 있었을 것 같다.
bug #17자동 복권 번호 초기화가 안되는 현상
LotteryTicket 내부 while문 조건이 잘못되어있어 반복문 진입이 안되서 생긴 문제
while (_numbers.Length == i) → while (_numbers[i] == 0) 변경
bug #18당첨 확인에서 계속 복권이 없다고 출력되는 현상
BuyLottery()에서 복권을 사놓고 마지막에 ResetArr(_lottery.Numbers); 로 다시 복권 번호를 리셋해서 생긴 문제
ResetArr(_lottery.Numbers); 삭제
bug #19복권 당첨 금액이 중첩되는 현상
참조하는 배열 TransPay의 연속 사용으로 중복 연산이 되어 발생하는 문제
int pay = TransPay(); 로 값에 할당하여 pay를 매개변수로 넣음으로 중복 연산이 생기지 않도록 했다.
bug #20
Util PrintForNum에서 전위,후위 연산자가 작동하지 않는 현상
코드의 길이가 길어지고 IDE를 오랫동안 끄지 않아서 그런지, 이전까지 제대로 작동하던 Util 함수가 작동하지 않았다.
전위,후위 연산자를 모두 빼고 복합대입연산자로 넣었더니 갑자기 또 제대로 작동했다.
→ 대체 왜...? 복합대입연산자가 더 빠른건가???
bug #21~~이후 버그가 1~2개 정도 터졌지만 시간에 쫓기다보니 커밋 때 정리를 하지 못했다. 다시 버그를 구현하려고 해도 내용도 제대로 기억이 안나서 재현이 불가능했다. 앞으로 커밋을 조금 더 꼼꼼히 해야겠다는 생각과 함께 디버깅 정리는 마무리하려한다.
다음은 리팩토링 과정인데, 아마 Til에 작성할 것 같지는 않지만 만약 따로 메모할 부분이 있으면 리팩토링이 끝나고 따로 정리를 해보겠다.