icon안동민 개발노트

C++ 기본 문법 (변수, 자료형, 연산자)


 언리얼 엔진에서 C++를 사용할 때는 기본적인 C++ 문법과 함께 엔진에서 제공하는 특별한 자료형과 규칙들을 이해해야 합니다.

 이 절에서는 C++의 기본 요소들을 언리얼 엔진의 컨텍스트에서 살펴보겠습니다.

변수 선언과 초기화

 C++에서 변수는 다음과 같이 선언하고 초기화합니다.

int Health = 100;
float Speed = 500.0f;
bool bIsAlive = true;  // 언리얼 명명 규칙: bool 변수는 'b'로 시작
FString PlayerName = "Hero";
FVector Location(0.0f, 0.0f, 0.0f);

 언리얼 엔진에서는 UPROPERTY 매크로를 사용하여 변수를 선언할 수 있습니다.

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Character Stats")
int32 Health = 100;

 이 매크로는 변수를 언리얼 엔진의 리플렉션 시스템에 등록하여 에디터에서의 수정, 블루프린트 접근 등을 가능하게 합니다.

기본 자료형

 C++의 기본 자료형과 함께 언리얼 엔진은 자체적인 자료형을 제공합니다.

  1. C++ 기본 자료형
  • int, float, double, bool, char
  1. 언리얼 엔진 자료형
  • int32, float, bool
  • FString: 문자열
  • FName: 불변, 대소문자를 구분하지 않는 문자열
  • FText: 지역화 가능한 텍스트
  • FVector: 3D 벡터
  • FRotator: 3D 회전
  • FTransform: 위치, 회전, 스케일을 포함하는 변환

 예시

FVector PlayerPosition(100.0f, 200.0f, 50.0f);
FRotator PlayerRotation(0.0f, 90.0f, 0.0f);
FString PlayerName = "John Doe";
FName ItemCode = "Weapon_Sword";
FText PlayerTitle = LOCTEXT("PlayerTitle", "The Brave Warrior");

연산자

 C++의 기본 연산자들은 언리얼 엔진에서도 동일하게 사용됩니다.

int32 A = 5, B = 3;
int32 Sum = A + B;  // 덧셈
int32 Diff = A - B;  // 뺄셈
int32 Product = A * B;  // 곱셈
float Quotient = static_cast<float>(A) / B;  // 나눗셈 (형변환 주의)
bool IsGreater = A > B;  // 비교
A += 2;  // 복합 할당 연산자

 언리얼 엔진의 자료형에 대해서도 연산자가 오버로드되어 있습니다.

FVector Vec1(1.0f, 2.0f, 3.0f);
FVector Vec2(2.0f, 3.0f, 4.0f);
FVector Sum = Vec1 + Vec2;
float Dot = Vec1 | Vec2;  // 내적
FVector Cross = Vec1 ^ Vec2;  // 외적

특수 컨테이너 타입

 언리얼 엔진은 STL 대신 자체적인 컨테이너 타입을 제공합니다.

  1. TArray : 동적 배열
TArray<int32> Scores;
Scores.Add(100);
Scores.Add(85);
int32 FirstScore = Scores[0];
  1. TMap : 해시 테이블
TMap<FString, int32> PlayerScores;
PlayerScores.Add("John", 100);
PlayerScores.Add("Jane", 95);
int32 JohnScore = PlayerScores["John"];
  1. TSet : 중복을 허용하지 않는 컨테이너
TSet<FString> UniqueNames;
UniqueNames.Add("John");
UniqueNames.Add("Jane");
bool bHasJohn = UniqueNames.Contains("John");

타입 안전성

 언리얼 엔진은 타입 안전성을 강조합니다.

 예를 들어, int 대신 int32를 사용하여 플랫폼 간 일관성을 유지합니다. 또한, 언리얼 헤더 툴(UHT)은 리플렉션 시스템을 통해 타입 안전성을 강화합니다.

UPROPERTY(EditAnywhere, meta=(ClampMin="0", ClampMax="100"))
int32 HealthPercentage;  // 0-100 사이의 값으로 제한

언리얼 엔진의 명명 규칙

 언리얼 엔진은 특정한 명명 규칙을 따릅니다.

  • 클래스 : 'A' 또는 'U' 접두사 (예 : APlayerCharacter, UHealthComponent)
  • 인터페이스 : 'I' 접두사 (예 : IInteractable)
  • Enum : 'E' 접두사 (예 : EWeaponType)
  • Bool 변수 : 'b' 접두사 (예 : bIsAlive)
  • 기타 변수 : 카멜 케이스 (예 : PlayerHealth)

메모리 관리 기초

 언리얼 엔진은 가비지 컬렉션 시스템을 사용합니다.

 UPROPERTY 매크로로 선언된 객체 포인터는 자동으로 관리됩니다.

UPROPERTY()
UStaticMeshComponent* MeshComponent;

 그러나 일반 C++ 객체는 직접 관리해야 합니다.

MyClass* Obj = new MyClass();
// 사용 후
delete Obj;

 스마트 포인터를 사용하여 메모리 관리를 개선할 수 있습니다.

TSharedPtr<MyClass> SharedObj = MakeShared<MyClass>();
// 자동으로 메모리 해제

언리얼 엔진에서의 특별한 고려사항

  1.  리플렉션 시스템 : UCLASS(), UPROPERTY(), UFUNCTION() 매크로를 사용하여 엔진의 리플렉션 시스템과 통합합니다.

  2.  델리게이트 : 언리얼 엔진의 이벤트 시스템을 위한 특별한 문법을 사용합니다.

DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnHealthChanged);
  1.  언리얼 헤더 툴(UHT) : 특별한 주석과 매크로를 처리하여 추가적인 코드를 생성합니다.

  2.  비동기 프로그래밍 : 언리얼 엔진의 태스크 시스템을 활용합니다.

FString JsonString;
FHttpRequestPtr Request = FHttpModule::Get().CreateRequest();
Request->OnProcessRequestComplete().BindUObject(this, &AMyClass::OnResponseReceived);
Request->SetURL("http://example.com/api");
Request->SetVerb("GET");
Request->ProcessRequest();

 C++의 기본 문법은 언리얼 엔진 환경에서도 대부분 동일하게 적용되지만, 엔진의 특별한 자료형, 매크로, 그리고 시스템들과 조화롭게 사용해야 합니다.

 타입 안전성, 메모리 관리, 그리고 엔진의 다양한 서브시스템들을 고려하면서 코드를 작성해야 효율적이고 안정적인 언리얼 엔진 프로그래밍이 가능합니다.