유니티에서 static 클래스의 장단점

Noke·2025년 4월 9일

Unity TIL

목록 보기
9/31
post-thumbnail

오늘 게임을 만들면서 한 문제가 생겼다. 현재 씬에 존재하지 않는 GameManager 오브젝트의 변수에 접근해야 하는데 당연히 현재 씬에 없기 때문에 변수에 접근하면 오류가 발생하였다.

그렇다고, DontDestroyOnLoad() 메서드를 통해서 하나의 싱글톤을 유지할 수는 없었다. 내 현재 씬은 StartScene으로 게임 시작할 때 불리는 씬이기 때문에 GameManager 오브젝트를 이 씬에서 생성하면 GameManager 스크립트에서 필요로 하는 다양한 public 게임 오브젝트를 매치할 수 없기 때문이다.

따라서, 이번에 사용한 것은 static 클래스이다.

public static class GameConfig
{
    public static int level = 1;
    public static int maxCardNum = 10;

    public static string clearLevelString = "ClaerLevel";
}

위와 같이 코드를 짜면, 인스턴스화 할 수 없는 단 하나의 스크립트가 된다. 따라서, 따로 싱글톤을 작성하거나 게임 오브젝트의 컴포넌트로 전달받지 않아도 어느 씬에서든 사용할 수 있다.

그래서, 씬 변환에 상관없이 데이터 전달을 위해서 사용하기에 안성맞춤이다.

그러나, 이는 객체 지향 기반에 모순되는 확실한 단점이 존재한다. 이는 객체 지향 기반 엔진인 유니티에서 과도하게 사용하면 유지보수나 협업 측면에서 코드가 꼬일 수 있다.

  1. 캡슐화 파괴
    캡슐화란 객체 지향 프로그래밍의 한 특성으로, 객체 내부의 데이터는 감추고 필요한 인터페이스만 외부에 제공하는 것을 말한다.

    static 변수는 어디서든 접근이 가능하기 때문에 객체 내부의 상태가 공개적으로 노출된다. 즉, 코드가 커지면 커질수록 어느 스크립트에서 어떻게 변경을 했는지 추적하기 힘들다.

  2. 상속과 무관
    상속이란 부모 클래스의 속성과 기능을 자식 클래스가 물려받을 수 있는 객체 지향 프로그래밍의 한 특성이다.

    애초에 static 클래스를 선언하면, 유니티가 기본 제공하는 MonoBehaviour 클래스도 상속받을 수 없게 된다. 따라서, 상속에 의한 메서드 오버라이드, 메서드 오버로딩과 같은 다형성을 할 수 없다.

    참고로 다형성이란 같은 이름의 메서드가 다른 클래스 혹은 매개 변수에 의해 다른 동작을 하는 것을 말한다.

  3. 객체마다 독립성 X
    static 변수나 클래스는 모두 동일한 값을 공유하기 때문에 객체마다 고유한 상태를 가질 수 없다. 즉, 객체마다 고유한 상태가 필요한 상황(플레이어마다 다른 체력, 위치 등)이라면 사용할 수 없다.

따라서, static 클래스나 변수는 적절한 때에만 사용하고 가급적 다른 방식으로 문제를 해결하는 것이 좋다. 물론, 나도 이번 프로젝트에서 사용하게 되었지만, 다음에는 왠만하면 사용하지 않을 것이다.

profile
유니티 개발자(진)

0개의 댓글