본문 바로가기
우테코 프리코스/프리코스 오픈미션

게임 진행을 어떻게 제어할까?

by sloth365 2025. 11. 9.

내 목적은 게임은 계속해서 진행되고 특정 입력을 통해 무한루프를 제어할 것이다.

 

어떻게 할 것인가?

고민 끝에 생각해 낸 나의 아이디어는 두 가지다.

첫 번째로 예외는 발생하면 잡을 때까지 외부로 넘어가기 때문에

복잡한 관계 속에서 예외로 제어할 수 있을 것 같다.

두 번 째는 상태를 반환해서 반환된 값을 통해 제어할 수 있을 것 같다.

 

하지만 둘 다 마음에 들지 않는다.

 

게임을 무한루프로 진행하다가 종료할 때 예외를 터뜨려서 게임을 제어한다?

예외가 아닌 올바른 상황에서 예외를 터뜨린다는 게 이상하다고 느껴서

좋은 선택지 같다고 느껴지지 않았다.

 

그렇다면 반환값은 어떨까?

public interface Option {
    void play();
}

 

이미 반환값이 없게 interfac를 구현했고 구현체들을 만들어버렸다.

반환값을 선택하게 되면 모든 구현체들을 수정해야 한다.

그런데 이것은 ShutdownOption의 트리거로 인해 반환되는 것이고

다른 Option 구현체들을 반환값이 필요 없다.

 

하나의 구현체에서 반환값이 필요해서 모든 구현체가 의미 없는 반환값을 가지는 것은

잘못된 설계 같다는 느낌이 들었다.

 

결국 내가 생각해 낸 아이디어로는 좋은 해결책이 떠오르지 않아서

자료 조사를 했고 알아낸 아이디어는 공유 플러그 방법이었다.

 

public class GameState {
    private boolean isRunning = true;

    public boolean getState() {
        return isRunning;
    }

    public void off() {
        isRunning = false;
    }
}

게임의 상태를 나타내는 클래스를 만들고 이 객체가 진행 상황을 인지하도록 하는 것이다.

 

이 세 가지 방법 중 어떤 방법이 더 나에게 맞을지 트레이드오프를 해야 한다.

장단점을 알아보자.

 

예외를 잡아서 처리하는 방식

장점

- 코드를 최소한으로 수정할 수 있다.

- 필요한 곳에서 예외를 터뜨리고 외부에서 잡아서 처리하면 된다.

단점

- 예외가 아닌 상황에 예외가 발생하는 안티 패턴이 일어날 것 같다.

 

상태값을 반환해서 처리하는 방식

장점

- 상태값을 통해 외부에서 if문으로 단순 제어만 하면 된다.

- 가장 구현하기 쉬울 것 같다.

단점

- 관련 없는 다른 interface의 구현체들도 상태값을 반환해야 한다.

 

상태를 알고 있는 객체로 처리하는 방식 (공유 플러그)

장점

- 관련 있는 interface의 구현체만 공유 플러그를 받으면 돼서 코드를 최소한으로 수정할 수 있다.

단점

- 클래스의 개수가 늘어난다.

- 추가적인 클래스로 관계가 복잡해진다.

 

나는 play()라는 메서드로 게임을 진행하라는 메서드인데 반환값을 가지는 건 올지 않다고 생각한다.

그럼 모든 메서드명을 수정해야 하고 추가적으로 반환값도

가지고 있어야 하기 때문에 코드 수정이 또 발생한다.

 

코드 수정은 최소화되지만 올바른 진행 상황이 예외로 처리된다는 것은 바람직한 설계가 아닌 것 같다.

 

그래서 고민 끝에 클래스 복잡도는 늘어나지만 코드 수정은 최소화하면서

안티 패턴이 발생하지 않는 공유 플러그 방식을 선택하게 되었다.

 

이로써 트레이드오프를 처음 고민해 보게 되는 값진 경험을 얻었다.