디자인 패턴/게임 프로그래밍 패턴

[게임 프로그래밍 패턴][12]하위 클래스 샌드박스

우향우@ 2024. 4. 29. 11:31

개요

하위 클래스 샌드박스는 상위 클래스가 외부와의 커플링 및 기능 구현을 주로 담당하고 하위 클래스에서는 상위 클래스에서 제공해주는 기능들로 가상 메소드를 구현하는 구조를 이야기한다. 이는 한 상위 클래스 아래에 만들어질 여러 하위 클래스들의 커플링을 한곳으로 모으는 것과 중복되는 코드를 상위 클래스에 모아 재활용할 수 있도록 하기위해 사용된다. 스킬 클래스들을 만든다 할 때 오디오, 파티클, 플레이어 이동등의 기능 및 외부 커플링을 상위 클래스에서 메서드로 모두 구현하고 하위 스킬 클래스에서는 이들을 이용하여 스킬 사용을 나타내는 가상 메서드를 구현하는 구조가 예시이다. 

 

상위 클래스 기능 제공 정도

위에서 말한 여러 이점때문에 상위 클래스에서 기능 제공을 맡는다. 하지만 상위 클래스에 너무 많은 코드와 커플링이 모이는 것 또한 이상적이지 않기에 상황에 따라 적절하게 기능 제공 정도를 조절할 필요가 있다. 수많은 외부와 하위 클래스들과 커플링되어있는 상위클래스에 추가적인 기능또는 커플링을 추가하는 것은 비용이 꽤 있으므로 일부 적은 하위 클래스에서만 사용하는 기능 또는 외부 커플링은 하위 클래스 자체에서 처리하는게 나을 수도 있다.

또한 외부에 대한 함수호출이 외부의 상태를 수정하느냐 안하느냐에 따라 판단할 수도 있다. 외부 상태를 수정하지 않는 것은 상대적으로 안전한 커플링 이므로 하위 클래스에서 맡아도 좋지만 그렇지 않은 경우는 더 눈에 띄는 상위 클래스에 두는게 나을 수 있다.

또한 단순히 외부 함수를 그대로 호출할 뿐인 함수는 하위 클래스에서 처리하는게 나을 수 있다. 하지만 상위 클래스의 private 멤버를 숨기는게 목적이라면 이러한 사용도 나쁘진 않다.

 

상위 클래스 기능 제공 나누기

상위 클래스가 제공하는 기능을 상위 클래스에서 메소드로 모두 제공할수도 있겠지만 이러면 상위 클래스에 너무 많은 커플링과 코드가 모여 좋지않다. 따라서 일부 메소드들을 구현한 보조 클래스를 만들고 상위 클래스가 이를 소지하도록 한다음 이를 리턴하는 함수를 제공해주는 식으로 코드를 분리할 수 있다. 이때 코드 분리 뿐 아니라 외부 커플링도 분리할 수 있다는 이점도 있다. 예를 들어 SoundPlayer라는 사운드와 관련된 메소드를 모아둔 보조 클래스로 분리한다면 오디오 기능을 사용하는 하위 클래스는 SoundPlayer를 include하고 GetSoundPlayer를 통해 객체를 받고 메소드를 호출하여 사용할 것이다. 오디오 기능을 사용하지 않는 하위 클래스는 SoundPlayer를 include하지 않아도 된다. 이렇게 하면 명시적으로 SoundPlayer를 사용하는 클래스와 아닌 클래스가 구분 되므로 SoundPlayer의 수정이 편할 것이다.

 

필요한 객체 얻기

상위 클래스가에서 파티클, 오디오기능등을 사용하기 위해 파티클 시스템등의 외부 객체가 필요하다고 하자. 이를 어떻게 얻을 수 있을까.

상위클래스 생성자로 받기

가장 간단하지만 상위 클래스의 생성자가 수정되면 이를 호출하는 부분도 수정되야 할수도 있으므로 유지보수성이 떨어진다.

2단계 초기화

기본 생성자를 사용하고 init메소드를 따로 제공하여 사용자가 init 메소드를 호출해 초기화하도록 하는 방법이다. 이 과정을 팩토리 메소드로 묶어 제공할수도 있다.

정적 객체로 얻기

인스턴스들이 같은 객체를 사용한다고하면 정적객체로 두고 초기화 시점에 한번만 초기화해주면 모든 인스턴스가 사용할 수 있다.

서비스 중개자

이후에 배울 서비스 중개자 패턴을 이용하여 얻을 수 있다.

 

 

 

 

 

참고서적

게임 프로그래밍 패턴