[2025_10_02]Json-1

2025. 10. 2. 20:59TIL

저장/로드 기능 구현과 Json

  • 구조 설계
    • GameManager 네임스페이스 내에 두 가지 클래스로 구분
      • SaveData 클래스 : 진행 중인 게임 데이터를 담는 역할
      • GameSaveManager 클래스 : 실제 저장/로드 메서드를 선언하고 구현
  • 직렬화(Serialization)
    • 객체 → 바이트 단위 / 문자열로 변환하는 과정
    • 필요한 이유:
      • 프로그램 종료 시 메모리 해제 → 데이터 유지 불가
      • 메모리 주소는 로컬이라 다른 컴퓨터로 전송 불가
      • 파일로 저장 불가 → 직렬화 필요
      • 네트워크 통신(멀티플레이)에서도 필수
    • 주의 : static 변수는 직렬화 불가
    • 예시 : "Name:전사, Level:5, Hp:100"
  • 생성자 필요성
    • 빈 생성자 : Json 역직렬화(로드 시) 필요
    • 매개변수 생성자 : 직렬화(세이브 시) 데이터 전달에 필요

2. 문제 상황 (입력 처리 버그)

  • 상황
    • Start 메서드에서 while(true)로 숫자 입력을 받아 기능 실행
    • 정상 입력(숫자) 시 잘 동작
    • 하지만 문자 입력(f) 후 숫자 입력 시 엉뚱한 화면 전환 발생
  • 원인
    • try-catch에서 FormatException은 잡았지만,
    • catch 이후에 break를 하지 않아 다시 while을 돌며 흐름이 꼬임
  • 해결 방법
    • int.TryParse 사용
      • 입력값이 int라면 result 반환
      • 숫자가 아니면 오류 메시지 출력 후 다시 입력 받음
       

하지만 이렇게 해결 하려니.... Console.ReadLine으로 값을 받아오는 대부분의 코드에 위의 코드들을 추가해야 했다.
그래서

이렇게 Util namespace안에 Utility class에 이 메서드를 구현해서 input마다 체크해서 result를 반환하도록 했다.

3. 배운 점

  • 디버깅 시 중단점(Breakpoint) 활용의 중요성
    • 예외 발생 후 프로그램 흐름을 따라가며 정확히 어디서 다시 루프를 타는지 확인 가능
    • 단순 추측보다는 실행 흐름을 직접 확인하는 습관 필요