자료구조
배열 & 벡터 Array, Vector 데이터 접근은 빠르지만 중간에 데이터를 삽입/삭제하는 것은 느림. std::vectoc
스택 & 큐 Stack, Queue 데이터를 넣고 빼는 순서가 정해진 자료구조
LIFO:
해시 테이블 Key-Value 쌍으로 데이터를 저장,
std::sort
std::vector (동적 배열)
크기가 자유자재로 늘어나는 똑똑한 배열
일반 c++ 배열(int arr[10];) 은 처음 크기를 정하면 바꿀수 없다, 하지만 std::vector는 필요에 따라 알아서 크기를 조절해주는 매우 편리한 배열이다.
선언 및 초기화
std::vector<int> v;
std::vector<int> v2(5);
std::vector<int> v3(5, 10);
std::vector<int> v4 = {1, 2, 3}
기능
v.push_back(값); 벡터 맨 뒤에 원소를 추가한다.
v.pop_back(); 맨 뒤 원소를 제거
v.size(); 벡터에 들어있는 원소 개수를 반환
v.begin(); / v.end(); 정렬이나 반복문에서 시작/끝 위치를 가리키는 포인터를 반환한다
헤시 테이블(std::unordered_map)
키를 주면 값을 즉시 찾아주는 사전
unordered_map 은 key-value 쌍으로 데이터를 저장하는 자료구조. 이름 그대로 순서(ordered)는 없지만 빠른 속도로 데이터를 찾고 추가, 삭제할 수 있다.
선언 및 초기화
#include <unordered_map>
#include <string>
std::unordered_map<std::string, int> myMap;
myMap[“사과”] = 1000;
myMap.insert({“바나나”, 2000}); insert 함수로도 추가할 수 있다. (인설트 함수가 뭐지?)
std::mpa 과 unordered_map 차이점
map은 key 를 기준으로 자동 정렬된다는 장점, 대신 속도가 느려 코딩 테스트 시 정렬이 필요한 상황이 아니면 unordered_map 을 쓰는 것이 유리
std::sort (정렬 알고리즘)
어떤 데이터든 원하는 기준으로 깔끔하게 정렬해주는 만능 정렬기.
C++ 표준 라이브러리에 포함된 정렬 함수.
오름차순 사용법
#include <algorithm>
#include <vector>
std::vector<int> v = {5, 2, 8, 1, 9};
std::sort(v.begin(), v.end());
// 결과: v = {1, 2, 5, 8, 9}
내림차순
#include <functional>
std::sort(v.begin(), v.end(), std::greater<int>());
// 결과: v = {9, 8, 5, 2, 1}
사용자 정의 기준으로 정렬 (compare 함수를 직접 만들어 복잡한 기준 제시하기)
Unreal 만의 데이터 타입
소스 코드 속 타입 재정의
unsigned char = uint8;
bool
uint8 를 주로 사용
참과 거짓을 표현하기 위해 Bit Field 연산자를 사용하여 1bit만 사용
자료형 uint8 이지만 논리값을 위한 변수임을 명시하기 위해 접두사 b를 붙임.
uint8 bsomething : 1;
기본타입을 따로 정의한 이유
C++ 의 한계: 1979년도에 태어난 C++
int 는 최소 32bit 보장할 뿐, 일부 플랫폼에서는 64bit로 해석될 가능성이 있음.
게임개발의 경우: 최적화 및 디버깅 용이, 불필요한 패딩이나 변환 줄이기
int32, uint8, FString 등 크기가 명확한 타입 사용
Float
언리얼 문자열 타입
FNmae:
FText: 텍스트 현지화를 위한 문자열 클래스
FString: 유일하게 조작이 가능한 문자열 클래스
언리얼 컨테이너 데이터 타입
(int도 받고 싶고 double도 받고싶을 때 템플릿 사용)
TArray: 가변 배열. 다이나믹 Array 자료구조. 객체를 순서대로 담아 효율적으로 관리하는 용도
캐시 메모리 속도가 가장 빠름.
TMap: STL의 unordered_map 과 동작원리가 유사.
TSet: 해시 테이블 형태 자료구조. STL의 unordered_set과 동작 원리가 유사. 중복을 허용하지 않는 데이터 목록을 관리할 때 사용.
캐시 효율
캐시 효율: CPU가 메모리에 접근할 때 캐시 메모리에서 데이터를 가져오는 비율(재사용률).
캐시 히트(Cache Hit): CPU가 요청한 데이터가 캐시 메모리에 존재하여 빠르게 접근할 수 있는 경우.
캐시 미스(Cache Miss): CPU가 요청한 데이터가 캐시에 없어서 RAM까지 접근해야 하는 경우.
Unreal의 TMap: 해시 테이블
C++ 의 Map: 레드 블랙 트리
// Player 이름(Key)와 점수(Value)를 위한 TMap
TMap<FString, int32> PlayerScores;
PlayerScores.Add(TEXT("Alice"), 100);
PlayerScores.Add(TEXT("Bob"), 200);
PlayerScores.Add(TEXT("Charlie"), 150);
// 동일한 Key에 다른 값 할당 → 값 덮어쓰기
PlayerScores.Add(TEXT("Bob"), 300); // 기존 Bob 점수 200 → 300으로 변경
// Key를 사용하여 값에 접근
if (PlayerScores.Contains(TEXT("Alice")))
{
int32 AliceScore = PlayerScores[TEXT("Alice")];
UE_LOG(LogTemp, Warning, TEXT("Alice's Score: %d"), AliceScore);
}
// Key-Value 순회
for (const TPair<FString, int32>& Elem : PlayerScores)
{
UE_LOG(LogTemp, Warning, TEXT("%s's Score: %d"), *Elem.Key, Elem.Value);
}
// 값 삭제
PlayerScores.Remove(TEXT("Charlie"));
UClass
언리얼 스마트 포인터 타입
UObject에 대해서만 가비지 컬렉팅이 가능, 순수 C++ 객체를 사용하는 경우 따로 메모리 관리
(자주 사용하지 않음)
TSharedPtr: 참조 카운트를 기반으로 여러 객체가 공유하는 스마트 포인터. 순환 참조 문제
TWeakPtr: 약한 참조. 순환 참조 방지할 때 사용
TUniquePtr: 소유권 하나뿐인 스마트 포인터.
TSharedRef: 절대 null이 될수 없음. 참조 객체가 항상 유효해야 할 경우 사용
(자주 사용)
TWeakObjectPtr: UObject에 대한 약한 참조 포인터.
TSoftObjectPtr: 에디터와 런타임에서 리소스를 지연 로드할 때 사용. (Asset 경로 저장)
TSoftClassPtr: UClass 에 대한 지연 로드용 포인터.
언리얼 수학 관련 타입
FVector: 위치, 방향, 속도 등 표현하기 위한 타입
FVector2D: 2D벡터. Ui나 평면 계산에 사용
FRotator: 상하좌우, 기울기 표현되는 오일러 회전값. (Pitch Yaw Roll)
FQuat: 사원수(Quaternion) 회전 표현 방식. 짐벌락 현상을 방지할 수 있음.
FTransform: 위치, 회전(FQuat) 스케일을 하나로 묶은 변환 행렬.
FMatrix: 행렬 표현 타입
FBox, FSphere: 경계 박스 및 경계 구현
언리얼 시간 관련 타입
FDateTime: 날짜와 시간을 표현하는 타입 (년월시분초)
FTimespan: 두 시각 간의 시간차를 나타냄
FTimerHandle: 타이머 관리용 핸들. 반복적으로 함수 호출할 때 사용.
언리얼 색상 표현 타입
FColor: 8(RGBA) 주로 디버그용
FLinearColor: float(RGBA) 색상 표현 타입.
UObject 타입
UObject: 모든 언리얼 클래스의 최상위 부모 클래스. Garbage Collection 대상이며 액터처럼 월드에 직접 존재하지 않음
AActor: 게임 월드에 배치될 모든 객체의 부모 클래스.