c++/객체지향

Struct 와 Class

길자 2025. 11. 27. 12:16
반응형

C#과 C++ 에서의 차이가 있다. C++의 경우 접근 지정자에서만 차이가 보일뿐 언어로서 차이는 거의 동일하고 관습적 차이가 있다. C#의 경우 값 형식(복사/메모리) 및 상속 등에 차이가 있다. 다만 언리얼의 경우 리플렉션 매크로가 붙기 때문에 달라진다

Struct

  • 다양한 타입의 변수 집합(int, string, float 등) 을 하나의 타입으로 나타낸것 (단순 데이터 컨테이너)
  • 하나 이상의 기본 타입을 가지고 새로운 자료형을 정의하는 사용자 정의 타입
  • 복잡한 행동(Method) 보다는 단순한 상태(Data) 를 저장하는데 초정

Class

  • 클래스 객체를 만들어 낼 수 있는 틀, 객체지향 언어에서 하나의 프로그램 단위는 클래스 이다.
  • new 연산자를 통해 객체를 생성하고 할당해 줘야 사용 가능하다

 

USTRUCT vs UCLASS

USTRUCT 여러 데이터를 논리적으로 묶어 하나의 값 타입으로 사용하고 싶을떄,

UCLASS 게임 세계에 실제로 존재하며 동작을 수행하는 모든 객체의 기반

구분 USTRUCT UCLASS

C++ 기반 C++ struct (구조체) C++ class (클래스)
상속 기반 상속 계층이 단순하며, UObject를 상속하지 않음 UObject를 상속하는 클래스에 사용됨
메모리 관리 GC(가비지 컬렉션) 관리 대상이 아님. 주로 스택 또는 다른 UObject 내부에 값 타입으로 존재하며, 수동으로 수명 관리 필요 GC 관리 대상. 힙에 할당되며, 엔진의 메모리 관리 시스템이 수명을 추적하고 관리함
생성 일반적인 C++ 생성 (= 또는 복사 생성자) NewObject<T>() 함수를 사용하거나 언리얼 시스템에 의해 생성됨
목적 단순 데이터 구조체, 컨테이너 역할. 연관된 데이터를 묶어 저장/전송하는 가벼운 용도 게임 로직, 동작(Behavior)을 담당하는 객체. 액터, 컴포넌트 등 동적인 상호작용이 필요한 객체
지원 기능 UPROPERTY만 지원 (데이터 노출) UPROPERTY, UFUNCTION 모두 지원 (데이터 및 함수 노출)
오버헤드 상대적으로 가벼움 (데이터 크기만 차지) 상대적으로 무거움 (UObject의 메타데이터 오버헤드 포함)
이름 규칙 통상적으로 접두사 F를 사용 (예: FMyStruct) 통상적으로 접두사 U 또는 부모 클래스 접두사 사용 (예: UMyClass, AActor)

C++ 공통점

멤버 변수, 멤버 함수를 가질 수 있고 생성자 / 소멸자를 가질 수 있고 상속 / 가상 함수 / 다형성 다 된다.

C++ 차이점

기본 접근 지정자와 기본 상속 지정자의 차이 말고는 거의 같은것. c++ 에서는 객체 그 자체가 들어감 (값으로 다루는 타입)

  • struct는 public class 는 private
  • 언어 차원의 의미 보단 현업/관습에서의 구분 struct = 단순 데이터 묶음, 멤버를 전부 public으로 두고 캡슐화는 거의 하지 않음, ex)좌표,색상,설정 값 class = 캡슐화/추상화 가 필요한 타입, 멤버를 private 로 두고 public 함수로만 접근하는 식

C# 차이점

struct와 class 는 완전히 다른 종류의 타입. 기본 접근 지정자 또한 c++과 다르게 두 타입 전부 private

  • stuct = 값 타입(Value) class 는 참조 타입(Reference) 즉 struck로 대입/함수 인자로 넘길때 복사가 일어난다. class의 경우 변수에는 객체의 참조(함수 포인터)가 들어있다.(참조만 복사)

메모리관점

struct

  • 지역변수 → 스택 or 레지스터
  • 클래스의 필드로 사용 → 그 객체 안에 인라인으로 포함
  • 배열이면 요소가 연속적으로 존재

class

  • new 로 생성 → 힙
  • 변수에는 그 객체의 참조(주소)만 들어감
  • 배열이면 참조들이 들어있고 실제 객체는 힙에 따로 존재

작은 struct를 배열로 쓰면 캐시 친화적이고 빠를수 있고, 너무큰 struck 는 복사 비용 떄문에 오히려 느릴 수 있음.

상속 / 기능 차이

Struct

  • 상속 불가, 단 interface 는 구현가능
  • 기본 생성자(매게변수가 없는것) 는 런타임에서 자동 제공

Class

  • 다른 class 를 상속 가능 ( : baseClasee)
  • virtual / override 로 다형성 사용
  • interface 가능
  • 생성자를 자유롭게 설계 가능

게임 개발 관점

Struct 를 써야 할 때

  • 작고 자주 쓰이는 값, (큰값일 경우 → 복사비용 커짐)
  • 논리적으로 값 자체인것 ex) 색 좌표 범위 벡터 등등
  • 불변으로 설계할때 (하나를 여러군데에서 공유해서 수정하지 않을때)

class 를 써야 할 때

  • 수명 관리가 중요한 것, 정체성이 있는 객체 ex) 플레이어, 총알, UI등
  • 여러곳에서 같은 인스턴스를 공유하고 수정해야 할 때
  • 상속 / 다형성이 필요한것
반응형