카테고리 없음

34일차: C++ 복습 (자료구조, c++역사 겸 언리얼 타입 공부)

maypawn 2025. 7. 8. 20:49

자료구조

 

배열 & 벡터 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 에 대한 지연 로드용 포인터.

참고자료: https://dev.epicgames.com/documentation/ko-kr/unreal-engine/smart-pointers-in-unreal-engine?application_version=5.5

 

언리얼 수학 관련 타입

 

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: 게임 월드에 배치될 모든 객체의 부모 클래스.