문제 발생
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 오류가 해결됨
'flutter앱개발과정' 카테고리의 다른 글
기차예매서비스 - 트러블슈팅(setState()를 썼는데 화면이 안 바뀜) (0) | 2025.03.31 |
---|---|
RPG게임 - 트러블슈팅(PathNotFoundException: 파일을 찾을 수 없음) (0) | 2025.03.20 |
dart문법 - 비동기 프로그래밍과 Dart (0) | 2025.03.19 |
dart문법- 라이브러리 정리 (0) | 2025.03.18 |
dart문법 - 예외처리 (0) | 2025.03.17 |