본문 바로가기

flutter앱개발과정

RPG 게임 - 트러블 슈팅(Stack Overflow 오류)

문제 발생

RPG  게임을 실행하자, 아래와 같은 Stack Overflow 오류가 발생했다.

Unhandled exception:
Stack Overflow
#0      new _Random._withState (dart:math-patch/math_patch.dart:195:3)
#1      new Random (dart:math-patch/math_patch.dart:181:16)
#2      new Monster (file:///Users/t2024-m0191/flutter_project/battle_rpg_game/bin/monster_class.dart:12:16)
#3      new Character (file:///Users/t2024-m0191/flutter_project/battle_rpg_game/bin/character_class.dart:12:21)
...
(계속 반복)
...

원인 분석

Character 클래스

  • Character 객체는 Monster 객체를 필드로 포함하고 있음.
class Character {
  Monster monster = Monster();
}

Monster 클래스

  • 반대로 Monster 객체도 Character 객체를 필드로 포함하고 있음.
class Monster {
  Character characterObj = Character();
}

결과적으로 Character가 생성될 때 Monster가 생성되고, Monster가 다시 Character를 생성하는 무한 루프가 발생
이런 순환 참조(Circular Dependency)로 인해 Stack Overflow가 발생한 것이다.

 

해결 방법

Monster 클래스에서 Character 객체를 필드로 갖지 않도록 변경!

  • Character 객체를 생성하지 않고, 대신 메서드의 파라미터로 받아서 사용하도록 수정.

수정된 monster_class.dart

import 'dart:math';
import 'dart:io';

//몬스터 클래스
class Monster {
  String monName = "";
  int monHealth = 0;
  int monPower = 0; // 몬스터 공격력
  int monDegfense = 0; // 몬스터 방어력 (기본값 0)
  var random = Random();

  // 기존 characterObj 필드를 제거

  Future<void> loadMonster(Character characterObj) async {
    var monster = File('lib/monsters.txt'); // monsters 파일 읽기
    List<String> monsterList = await monster.readAsLines();
    int randomIndex = random.nextInt(monsterList.length);
    List<String> monValues = monsterList[randomIndex].split(',');

    monName = monValues[0];
    monHealth = int.parse(monValues[1]);
    int maxPower = int.parse(monValues[2]);

    // 몬스터 공격력은 최소한 캐릭터 방어력과 같거나 높은 값이어야 함
    monPower = max(random.nextInt(maxPower + 1), characterObj.chDefense);

    print('$monName - 체력 : $monHealth, 공격력 : $monPower');
  }
}

결과

Monster 클래스에서 Character 객체를 필드로 갖지 않도록 변경한 후, Stack Overflow 오류가 해결됨