접두사는 왜 쓰는가

언리얼은 엔진 코드, 플러그인, 내 코드가 전부 하나의 전역 공간에서 컴파일된다.

클래스 이름이 그냥 전역에 노출되기 때문에 이름 충돌 방지를 위해 접두사를 쓴다.

 

UE 자체 접두사는 강제 규칙이다.

 

접두사 의미
U UObject 상속
A AActor 상속
F 일반 구조체
E 열거형
I 인터페이스

 

 

내 GameMode는 A(엔진 규칙) + RD(내 프로젝트 식별자) = ARDGameMode.

 

에디터에서 클래스를 생성할 때는 엔진 접두사 없이 RDGameMode처럼 적으면 된다.

엔진이 알아서 ARDGameMode로 설정한다.

 

모듈과 플러그인 개념

모듈은 같이 컴파일되는 코드 덩어리다. .Build.cs가 그 모듈의 명세서 역할을 한다.
플러그인은 여러 모듈을 담은 묶음이다. 프로젝트가 바뀌어도 통째로 재사용할 수 있다.

C++ 클래스 생성 시 Public/Private 폴더를 고르는 옵션이 있다.

이 분리는 외부 모듈이 내 헤더를 include할 때 의미가 생긴다.

Public은 외부 접근 허용, Private은 내부 전용이다.

 

NumberBaseball은 모듈이 하나뿐이라 지금 시점에서 나눌 이유가 없다.

모듈이 여러 개로 나뉘는 프로젝트 규모가 되면 그때 다시 정리할 것.

 

StaticClass()와 incomplete type

StaticClass()는 실제 객체가 아니라 클래스의 설계도 정보를 반환하는 함수다.

GameMode 생성자에서 PlayerControllerClass = ARDPlayerController::StaticClass() 처럼 쓸 때, 엔진은 이 설계도를 받아두고 게임 시작 시점에 실제 객체를 만든다.

객체를 넘기는 게 아니라 설계도를 넘기는 구조.

 

StaticClass()를 쓰려면 해당 클래스의 헤더가 반드시 include되어 있어야 한다.

전방 선언(forward declaration)만 있으면 이름은 알지만 정의를 모르는 상태, 즉 incomplete type이 되어 컴파일 에러가 난다.

 

GameMode.cpp에서 하위 클래스 4개를 바인딩한다면 헤더 4개를 전부 include해야 한다.

생성자는 반드시 public에 둬야 한다.

엔진이 직접 호출해서 객체를 생성하기 때문에 private이면 엔진이 접근하지 못한다.

+ Recent posts