반응형
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등
- 여러곳에서 같은 인스턴스를 공유하고 수정해야 할 때
- 상속 / 다형성이 필요한것
반응형
'c++ > 객체지향' 카테고리의 다른 글
| C++ 4대 캐스트(cast) (0) | 2025.11.30 |
|---|---|
| [c++] 포인터*와 참조& (0) | 2025.11.30 |
| vtable(가상 함수 테이블) 개념 (0) | 2025.11.30 |
| 순수가상함수 (0) | 2025.11.30 |
| [운영체제] 객체지향 프로그래밍(OOP, Object-Oriented Programming) (0) | 2025.11.27 |