오늘의 코드카타
110 옮기기
- 특정 문자열 추출 후, 사전순 정렬
- 숫자 카운팅하기
- LV3 - 34%
-> 문제 풀이
오늘의 공부
진행한 과제
내일 진행할 과제
- 9번 과제
- 기본 숫자 야구 로직 오류 수정
- 도전 과제 : 시간 제한을 두고, 기회를 주는 기능 추가
- 10번 과제
정리 노트
오늘의 CS
전치 증감 vs 후치 증감
전치 증감
- 동작 과정
- 변수 i의 값을 먼저 1 증가
- 증가된 값을 반환
- 특징
- 불필요한 복사 객체를 만들지 않고, 자기 자신을 참조로 반환
후치 증감
- 동작 과정
- 현재 값을 임시 변수에 저장 (복사 비용 발생)
- 변수 i의 값을 1 증가
- 증가 전 값을 반환
- 특징
- 원래 값을 반환해야 하므로, 임시 객체를 하나 더 생성해야 함
- 전치 증감보다 비용이 큼
성능 비교
- 원시 타입 (int, float 등)
- 사용자 정의 타입 (Iterator, BigInteger 등)
- 후치 증감은 임시 객체 생성 -> 복사 -> 반환 과정 때문에 비용이 더 큼
언리얼 엔진의 RTTI 방식
- C++ 표준 RTTI를 비활성화하고 자체 시스템을 사용
- 이유 : 성능, 크로스플랫폼 일관성, 리플렉션
UObject + UClass의 메타데이터
핵심 구조
UObject
- 모든 리플렉션 가능한 클래스의 베이스
- 각 인스턴스는 자신이 어떤
UClass에 속하는지 가리키는 포인터를 멤버로 가짐
- 즉,
MyActor->GetClass() 호출 시 자기 타입의 메타데이터 객체를 반환
UClass
- 클래스 자체를 설명하는 메타데이터 객체
SuperClass 포인터를 가지고 있어 계층 구조를 표현함
- 리플렉션 정보(프로퍼티, 함수, 인터페이스 등)을 다 저장
UCLASS() 매크로를 쓰면 UHT(Unreal Header Tool)가 코드 생성 시 클래스마다 정보 생성
StaticClass() : 특정 클래스의 전역 UClass 객체를 반환
GetClass() : 객체가 실제로 어떤 UClass인지 반환
동작 과정
UObject 인스턴스는 자기 타입을 가리키는 UClass*를 멤버로 들고 있음
UClass는 자기 부모(SuperClass)를 가리킴 -> 타입 계층 구조 유지
IsA() 호출 시, 현재 UClass부터 부모까지 올라가며 비교
Cast<>()는 IsA() 확인 후 안전하게 C++ 캐스팅 수행
내부 동작 코드
bool UObject::IsA(const UClass* SomeClass) const
{
for (UClass* CurrentClass = GetClass(); CurrentClass; CurrentClass = CurrentClass->GetSuperClass())
{
if (CurrentClass == SomeClass)
{
return true;
}
}
return false;
}
Cast<>() : c++의 dynamic cast를 대체하는 안전한 다운 캐스팅
template<typename T>
FORCEINLINE T* Cast(UObject* Src)
{
return (Src && Src->IsA(T::StaticClass())) ? (T*)Src : nullptr;
}