Inflearn brand logo image

인프런 커뮤니티 질문&답변

SeoArc님의 프로필 이미지
SeoArc

작성한 질문수

[Unity] 함께 만들어가는 방치형 게임 개발

오브젝트 풀링 (Object Pooling)

Pool_Mng, Base_Mng 참조

작성

·

46

0

안녕하세요 강사님! 수업 유익하게 잘 수강 중 입니다!

 

다름이 아니라,

BaseMng, PoolMng 구현 중 궁금한 점이 생겨 질문드립니다.

 

BaseMng의 경우 PoolMng를 관리하고 있고, PoolMng에서는 BaseMng.instance.InstantiatePath() 등으로 BaseMng를 참조하고 있는데, 추후에 순환참조되는 문제가 발생하지는 않는지 궁금하여 질문드립니다.

 

좋은 강의 제공해주셔서 감사드립니다!

답변 3

0

SeoArc님의 프로필 이미지
SeoArc
질문자

답변 감사드립니다! 기존의 구조에서 순환참조가 발생하지 않는다는 부분을 잘 알았습니다!

 

그런데 혹여나, 개발자의 손에 의해

public GameObject InstantiatePath(string path)
{
    Pool.PoolingObj(path); // 이런 코드가 실수로 작성된다면..
    return Instantiate(Resources.Load<GameObject>(path));
}

BaseMng의 InstantiatePath 함수에서 실수로 이런 식으로 작성된다면.. 서로 호출하는 구조가 되어, 컴파일 타임에는 오류가 발생하지 않지만.. 런타임에 오류가 발생할 것 같아 궁금해서 여쭤봤습니다..!

 

 

0

Pinous님의 프로필 이미지
Pinous
지식공유자

안녕하세요! 강의를 유익하게 수강해주셔서 감사합니다 😊

문의주신 내용에 대해 답변드리겠습니다.

결론부터 말씀드리자면,

현재 구조에서는 순환참조로 인한 문제는 발생하지 않습니다.

그 이유는 다음과 같습니다:


1. PoolMng은 MonoBehaviour가 아닙니다

PoolMng은 MonoBehaviour를 상속받지 않기 때문에 Unity의 Awake, Start, Update와 같은 생명주기 메서드에 의존하지 않으며, 직접 생성 및 초기화하는 시점을 우리가 제어하고 있습니다.

즉, BaseMng에서 new PoolMng()으로 명확히 생성하고 나서 필요한 초기화를 수행하기 때문에 순환적으로 꼬일 일이 없습니다.

2. BaseMng는 Singleton으로 항상 먼저 생성됩니다

BaseMng.Instance는 게임 시작 시 가장 먼저 초기화되도록 설계되어 있으며, 내부에서 PoolMng를 포함한 다른 매니저들을 순차적으로 생성합니다. 이 시점 이후부터 PoolMng가 BaseMng.Instance를 참조하는 것은 이미 생성된 인스턴스를 참조하는 것이기 때문에 문제가 없습니다.

0

안녕하세요, 인프런 AI 인턴입니다. SeoArc님.

순환 참조(Circular Reference)는 두 개 이상의 클래스가 서로 인스턴스를 참조할 때 발생할 수 있는 문제로, 이는 주로 메모리 누수나 예기치 않은 동작을 유발할 수 있습니다. 그러나 적절히 설계된 구조에서는 이런 문제가 발생하지 않도록 관리할 수 있습니다.

순환 참조에 대한 고려사항

  1. 의존성 관리:

    • BaseMng와 PoolMng 간에 직접적인 의존성을 최소화하는 것이 좋습니다. 각 클래스가 서로의 구체적인 구현에 의존하기보다는 인터페이스나 단방향 의존성을 활용하여 결합도(coupling)를 낮추는 것이 중요합니다.
  2. 싱글톤(Singleton) 패턴의 활용:

    • BaseMng와 PoolMng가 모두 Singleton 패턴을 사용한다면 순환 참조로 인한 문제가 발생할 확률이 낮아집니다. 싱글톤은 클래스의 인스턴스가 하나만 생성되도록 보장하므로, 인스턴스 관리가 상대적으로 단순해집니다.
  3. 인터페이스의 활용:

    • 두 클래스 간에 공통적인 동작을 인터페이스로 정의하고, 해당 인터페이스를 구현하게 함으로써 서로의 클래스에 직접적으로 의존하는 일을 피할 수 있습니다.
  4. 초기화 순서의 문제 해결:

    • 두 클래스가 초기화 시점에 서로 참조해야 할 경우에는, Awake, Start와 같은 Unity의 초기화 메서드에서 인스턴스를 명확하게 설정하고 관리해야 합니다. 순환 초기화로 인해 객체가 예기치 않게 null이 될 수 있는 상황을 방지하세요.

기존에 비슷한 상황을 다룬 경험이 있는 학습자들의 내용을 참고하여 더욱 깊이 있는 학습과 이해를 추구하실 수 있습니다:

이 포함된 링크들은 객체 풀링 문제 해결과 초기화 순서 관리에 대한 실질적인 고민과 솔루션을 다룬 질문들입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

SeoArc님의 프로필 이미지
SeoArc

작성한 질문수

질문하기