본문 바로가기
개발/게임 디자인 패턴

게임 디자인 패턴 8. 하위 클래스 샌드박스 (Subclass Sandbox Pattern)

by 석시 2023. 11. 1.



하위 클래스 샌드박스는 서로 상속 관계에 있는 두 클래스 사이에서 부모와 자식 어느 곳에 주요 기능을 넣을 건지에 대한 것을 이야기 한다.

책에서는 다음과 같이 이야기하고 있다.

상위 클래스가 제공하는 기능들을 통해서 하위 클래스에서 행동을 정의한다.


하위 클래스 샌드박스 패턴

캐릭터마다 다른 효과를 가진 공격 기능을 구현한다고 해보자.

부모 클래스가 되는 공격 클래스를 구현하고 그것을 상속받아 각 캐릭터 공격 클래스를 구현한다고 해보자.

각 캐릭터 공격마다 아주 열심히 상세하게 클래스를 작성하면 다음과 같은 문제들이 발생한다.

  1. 중복 코드가 많아진다.
  1. 거의 모든 게임 코드가 내가 작성하는 클래스와 커플링된다.
  1. 외부 시스템이 변경되면 클래스가 깨질 가능성이 높다.
  1. 모든 자식 클래스가 지켜야 할 불변식을 정의하기 어렵다.

그래서 하위 클래스 샌드박스 패턴에서는 원시명령을 가장 상위 클래스의 protected 메서드로 만들어 모든 하위 클래스에서 쉽게 접근할 수 있게 만들어 준다.

여기서 포인트가 protected인거다.

하위 클래스 샌드박스 패턴에서는 protected를 쓰는 이유가 이 함수는 하위 클래스용이라는 것을 알려주기 위해서이다.

이렇게 함으로써 1번의 중복 코드 문제는 해결이다.

여러 하위 클래스에서 중복되는 코드가 있다면, 상위 클래스로 그 기능을 올리기만 하면 되기 때문이다.

2번의 커플링 문제는 해결이 되지 않지만, 그나마 좀 나아진다!

커플링되어야 하는 요소들을 전부 상위 클래스에 몰아넣으면, 상위 클래스만 커플링 되고 하위 클래스들은 커플링되지 않는다!

그러면 커플링된 클래스를 추적하거나 관리하기가 용이해진다.

따라서 결론은 상위 클래스에 정성을 쏟자!가 되시겠다.


언제 써야 하는가?

단순하기 때문에 써야 하는 상황 역시 명료하다.

책에서는 하위 클래스 샌드박스 패턴이 다음과 같은 상황일 때 좋다고 서술하고 있다.

  • 클래스 하나에 하위 클래스가 많이 있다.
  • 상위 클래스는 하위 클래스가 필요로 하는 기능을 전부 제공할 수 있다.
  • 하위 클래스 행동 중에 겹치는 게 많아, 이를 하위 클래스끼리 쉽게 공유하고 싶다.
  • 하위 클래스들 사이의 커플링 및 하위 클래스와 나머지 코드와의 커플링최소화하고 싶다.

다음과 같은 상황일 때 상위 클래스에 추상 protected 메서드 (샌드박스 메서드) 를 정의하고, 각 하위 클래스들은 제공 기능을 이용해 샌드박스 메서드를 구현한다.


깨지기 쉬운 상위 클래스 (Fragile Base Class)

위에 써있는 대로라면, 패턴을 구현하기 위해서 모든 커플링을 상위 클래스에 몰아넣어야 하기 때문에 깨지기 쉬운 상위 클래스 문제가 발생하게 된다.

이 말은 상위 클래스를 바꾸면 이러한 커플링이 깨져 문제를 일으키키 쉽다는 뜻이다.

따라서 상위 클래스 코드가 점점 스파게티 코드가 되어간다면, 제공 기능 일부를 별도 클래스로 뽑아내 책임을 나눠 갖는 컴포넌트 패턴이 도움이 된다고 한다.

유니티는 기본적으로 스크립트가 컴포넌트 구조로 되어 있기 때문에 상위 클래스를 짤 때 기능에 따라 잘 나누자라는 뜻이 되겠다.

워낙 간단하게 이루어져 있는 패턴이라 이렇게만 정리하도록 하겠다.


Uploaded by N2T