[C#] GameManager 기반 Scene 전환 구조 정리

shin0112·2025년 10월 16일
0

CSHARP

목록 보기
3/4

✨ 들어가며

오늘은 Scene 전환 구조에 대해 고민했다.
지금까지는 단순히 아래처럼 new로 새로운 씬을 생성하고 메서드를 호출하는 방식으로 구현하고 있었다.

if (input == "1")
{
    Console.WriteLine("스펙보기를 선택했습니다.");
    new SpecScene().Specification();
}

처음에는 이게 전혀 문제가 없어 보였다.
필요할 때 새로 만들어서 바로 실행하면 되니까, 가장 직관적인 방법이라고 생각했다.
그런데 튜터님이 “이런 식으로 new를 계속 쓰면 좋지 않다” 라고 하셨고, 그 이유가 궁금해졌다.


1️⃣ 왜 new Scene()이 안 좋은가

결국 이 방식의 핵심 문제는 두 가지다.

  1. 매번 새로운 객체를 만들어서 상태가 유지되지 않는다.
    Scene 안에 있던 변수나 상태는 while문이 끝나는 순간 사라진다.

  2. GC(Garbage Collector)가 불필요하게 자주 동작한다.
    → 새로 만든 Scene이 곧바로 버려지면, 메모리 정리를 위해 GC가 자주 개입하게 된다.

1번은 GameManager 같은 곳에서 데이터를 따로 저장해두면 어느 정도 해결되지만, 2번 문제는 근본적으로 성능과 안정성에 영향을 주는 부분이라 가장 중요하게 봐야 한다.


2️⃣ GC가 자주 일어나면 왜 문제일까?

C#의 GC는 더 이상 참조되지 않는 객체를 정리하는 역할을 한다.
그런데 이 정리 과정은 프로그램을 잠시 멈추고(Stop the World) 수행된다.

  • new Scene()으로 객체를 계속 만들고,
  • 금방 버리고,
  • GC가 그것들을 회수하려고 할 때마다

프로그램이 잠깐씩 멈추게 되는 것이다.

콘솔 기반이라 큰 체감은 없더라도, 실시간으로 동작하는 게임이라면 입력 지연이나 프레임 드랍으로 이어질 수 있다.
결국 new를 자주 사용하는 구조는 런타임 성능에 직접적인 영향을 준다.


3️⃣ 그래서 어떻게 바꿀까?

처음 떠올린 대안은 두 가지였다.

  1. 모든 Scene을 리스트로 관리
  2. GameManager에서 미리 전부 생성해 두고, 필요할 때 전환

현재 팀의 상황에서는 2번째 방법이 더 적절했다.
객체 지향적인 구조를 완전히 이해하지 않아도 사용할 수 있고, 여러 명이 동시에 작업할 때 가장 단순하게 유지할 수 있는 방법이기 때문이다.

이 구조에서는

  • Scene이 한 번만 생성되고,
  • 상태도 유지되며,
  • GC 호출도 거의 일어나지 않는다.

무엇보다, 팀 내에서 객체 지향 이해 수준이 달라도 전체 흐름이 단순하게 유지된다.
각자 자신이 맡은 Scene만 구현해도,
전체 실행 흐름은 GameManager에서 일관되게 제어된다.


4️⃣ “객체 지향이 아직 익숙하지 않은 팀”에서도 가능한 구조

이건 복잡한 설계나 상속을 몰라도 이해할 수 있다.
단순히 “필요할 때마다 new로 만들지 말고, 한 번 만든 걸 재사용하자”는 개념만 있으면 된다.

결과적으로

  • Scene 간 전환 흐름은 GameManager 한 곳에서만 관리되고,
  • 각 Scene은 자신의 역할만 수행하면 된다.

협업 안정성과 단순함을 우선한 선택이다.


✍️ 마치며

이번 구조를 고민하면서 느낀 건, “객체 지향은 상황에 맞게 쓰여야 한다”는 점이었다.

빠른 시간 안에 여러 사람이 동시에 작업해야 하는 환경에서는 복잡한 구조를 설계하는 것보다, 코드가 직관적이고 바로 적용 가능한 형태로 유지되는 것이 훨씬 중요했다.

GameManager가 모든 Scene을 한 번만 생성하고 흐름을 제어하는 방식은 필요 이상으로 구조를 복잡하게 만들지 않으면서도 메모리 낭비를 줄이고, 흐름을 명확하게 유지할 수 있었다.

0개의 댓글