클래스(Class) vs 구조체(Struct): 게임 개발에서 어떻게 활용할까?

클래스(Class) vs 구조체(Struct): 게임 개발에서 어떻게 활용할까?

게임 성능 최적화, 메모리 관리, 설계 구조... 이 모든 걸 결정짓는 건 의외로 '클래스'와 '구조체'의 선택일 수 있습니다.

안녕하세요, 게임 개발을 사랑하는 여러분! 요즘 저는 인디 게임 하나를 만들고 있는데, 캐릭터 데이터를 어떻게 저장할까 고민이 많았어요. 그러다 보니 자연스럽게 클래스와 구조체의 차이에 대해 깊이 파고들게 되더라구요. 이건 단순한 문법 차이가 아니라 성능과 유지보수성에 직접적인 영향을 주는 부분이니까요. 이번 포스트에서는 클래스와 구조체를 게임 개발의 실제 예제를 통해 비교하면서, 각각을 언제, 어떻게 활용하는 게 좋은지 함께 알아보겠습니다. 특히 저처럼 작은 팀에서 성능과 개발 속도를 모두 잡아야 하는 상황이라면 더더욱 중요하겠죠?

클래스와 구조체의 기본 차이점

게임 개발에서 클래스(Class)와 구조체(Struct)는 가장 기본적인 데이터 모델링 도구입니다. 둘 다 필드와 메서드를 가질 수 있지만, 가장 큰 차이는 '참조 타입'이냐 '값 타입'이냐에 있어요. 클래스는 참조 타입으로, 객체를 할당하면 그 객체의 참조(주소)가 전달되죠. 반면, 구조체는 값 타입이라 복사본이 전달됩니다. 이 차이는 변수 간의 동작, 메모리 사용, 성능에 직결되며, 특히 캐릭터나 아이템처럼 수많은 인스턴스를 다루는 게임에선 큰 영향을 미칩니다.

메모리와 성능 측면의 비교

항목 클래스 구조체
타입 참조 타입 값 타입
메모리 할당 스택
성능 GC의 영향을 받음 빠른 접근

게임 디자인 패턴과의 연결

게임에서 자주 사용되는 디자인 패턴은 클래스 중심으로 설계된 경우가 많습니다. 특히 객체 지향 프로그래밍의 대표 패턴인 아래 항목들을 보면 클래스 기반의 유연한 확장이 강점으로 작용합니다.

  • 싱글턴(Singleton): 글로벌하게 접근 가능한 게임 매니저 클래스
  • 상태 패턴(State Pattern): 캐릭터 상태 전이 구현
  • 전략 패턴(Strategy Pattern): AI 행동 방식 분리

클래스를 사용해야 할 때

클래스를 선택해야 하는 경우는 명확합니다. 우선 상속이 필요할 때, 그리고 공유된 참조를 통한 데이터 처리가 중요할 때입니다. 예를 들어, 여러 캐릭터가 동일한 상태 객체를 참조하는 경우, 구조체보다는 클래스가 적합하죠. 그리고 GC(Garbage Collection) 기반 언어에서는 장기적으로 유지되고 복잡한 관계를 갖는 객체에 대해 클래스를 쓰는 것이 메모리 관리에 유리합니다.

구조체가 더 유리한 경우

조건 설명
불변성 값의 변경이 없는 경우, 구조체는 더 안전한 선택입니다.
단순 데이터 벡터, 위치 정보, 색상 등 단순 수치형 데이터 저장에 적합합니다.
대량 생성 GC 부하 없이 수많은 인스턴스를 생성할 수 있습니다.

실제 예제 코드로 보는 활용법

예제를 통해 클래스와 구조체의 활용을 좀 더 명확히 이해해 봅시다. 다음은 Unity C# 기반의 코드 예시입니다.

  • 클래스: 캐릭터 상태 관리 (HP, 상태이상 등)
  • 구조체: 위치(Vector3), 방향, 색상(Color)
  • 혼합 사용: 캐릭터는 클래스, 위치는 구조체로 설계

게임에서 어떻게 활용하나?

클래스 (Class)를 사용할 때: "동적인 오브젝트, 상태가 자주 바뀌는 대상"

예 : 플레이어, 몬스터, 무기 등

public class Player
{
    public string name;
    public int hp;
    public Weapon equippedWeapon;
}
  • 클래스는 동일한 오브젝트를 여러 곳에서 공유하고 조작할 때 유리해요.
  • 예를 들어 player1이 무기를 바꾸면, 그 상태가 전체에서 반영돼야 하잖아요?
  • 그래서 무기, 캐릭터처럼 여러 컴포넌트에서 상태를 공유할 필요가 있는 대상에 클래스가 좋아요.

구조체 (Struct)를 사용할 때: "간단하고, 상태가 거의 안 변하고, 복사해도 되는 대상"

예 : 위치 좌표, 색깔, 데미지 정보 등

public struct DamageInfo
{
    public int amount;
    public string type;
}
  • 데미지 정보를 몬스터에게 줄 때, 그냥 값을 복사해서 넘기면 되잖아요?
  • DamageInfo는 전달 후 다시 수정할 필요가 없기 때문에 구조체가 효율적이에요.
  • Unity도 이런 방식으로 Vector3, Color 등을 구조체로 만들어서 자주 사용하게 해요.

 예시 상황

예제 : 몬스터가 플레이어에게 공격할 때

public struct DamageInfo
{
    public int amount;
    public string type;
}

public class Player
{
    public int hp;

    public void TakeDamage(DamageInfo damage)
    {
        hp -= damage.amount;
    }
}
  • DamageInfo는 공격 한 번에만 쓰이는 일회성 데이터니까 구조체로!
  • Player는 상태가 계속 바뀌고 다른 곳에서 참조될 수 있으니 클래스가 적절해요.

정리 요약

언제 사용할까? 클래스(Class) 예시 구조체(Struct) 예시

상태가 자주 바뀌고 공유 필요 캐릭터, 무기, 몬스터 등 위치, 데미지, 색상, 설정값 등
복사되어도 문제없는 값
여러 객체가 같은 주소 참조 필요
Q 클래스와 구조체는 완전히 교체 가능한가요?

아니요. 둘은 메모리 처리 방식과 복사/참조 동작이 달라 용도에 따라 선택해야 합니다.

Q Unity에서는 구조체보다 클래스를 더 많이 쓰나요?

복잡한 객체 관계나 상속이 필요한 경우 클래스가 더 많이 쓰입니다. 단순한 데이터는 구조체가 좋습니다.

Q 구조체를 잘못 사용하면 어떤 문제가 생기나요?

값 복사로 인한 성능 저하나 데이터 불일치 문제가 발생할 수 있습니다.

Q 구조체는 상속이 가능한가요?

아니요. 구조체는 상속을 지원하지 않습니다. 단순한 데이터 저장용으로 사용됩니다.

Q 게임 엔진에서 구조체는 어디에 주로 쓰이나요?

벡터, 회전값, 색상처럼 수치 기반의 연산이 많은 데이터에 많이 쓰입니다.

Q 클래스는 언제 성능 병목을 유발하나요?

객체가 많고 빈번히 생성/삭제되면 GC의 영향으로 성능 저하가 생길 수 있습니다.

오늘 이야기한 클래스와 구조체의 차이, 그리고 게임 개발에서의 활용법이 여러분의 개발에 조금이나마 도움이 되었길 바랍니다. 결국 중요한 건 "상황에 따라 유연하게 선택하는 것"이 아닐까 해요. 너무 원칙에 얽매이지 않고, 목적에 맞는 도구를 선택하는 센스! 그게 바로 실력이라고 생각해요. 혹시 비슷한 고민을 하고 계셨다면 댓글로 함께 나눠주세요. 여러분의 경험도 궁금하거든요!