[UE5 TIL] Day 17 - C++ 학습/과제 작성

JungHoon Eum·2026년 3월 19일

C++ 라이브세션

Template Programming

  • 클래스 템플릿은 인스턴스 선언할 때 매개변수를 항상 명시할 필요가 있다
    MyTemplateClass<자료형> 인스턴스명;
    • 템플릿 함수는 안 그래도 되는 경우가 있음. 컴파일러가 유추할 수 있는 경우 알아서 만들어줌
      명시해도 당연히 좋긴 함 Add<int>(a, b) 이런 식으로
  • template <typename T> Add (T a, T b): int와 float이 들어오면?
    인스턴스 생성 때 <int>, <float>로 만들면 알아서 형변환 해주긴 함. 명시적 선언 안해주면 안됨.
    • 진짜 <int><float>를 더하고 싶으면? T, U 두개 선언해서 쓰는 게 맞다
  • 필요한 자료형이 2~3개면 굳이굳이 템플릿을 쓸 필요는 없다.
  • 자료구조를 만드는 게 아니면 그냥 클래스를 나누자.

STL

  • 메모리 자동 관리가 제공되는 자료구조 라이브러리
  • vector, map, set, stack, queue, list 등등...
    • 벡터, 맵 정도가 자주 쓰이고, set 이 가끔 쓰임
  • STL 자료구조는 다른 말론 컨테이너

언리얼 엔진의 경우

  • 회사들이 자신만의 컨테이너를 만들어서 STL을 대체/확장한다
  • Unreal Engine: TArray, TMap, TMultiMap, TSet

Vector

  • 데이터 증가 -> 자동으로 메모리 관리. 어떤 요소에도 Random Access 가능
  • push_back(), pop_back(), size(), capacity(),
  • reserve (size_t _newCapacity): capacity 늘려줌. 값 초기화는 안해줌.
  • 벡터 사이즈가 capacity보다 높아지면? 더 넓은 메모리 동적할당하고 복사해 감. <<< 비용 많이 듬. 처음부터 사이즈 넉넉하게.
  • _ 변수 뒤에 붙이는 거: 보통 멤버변수 표시하기 위해 이렇게 붙힌다.
  • reserve 함수는 vector STL 내부 구현 함수라 규칙이 좀 달라 _newCapacity 이렇게 해놨을 가능성 다분. 실제론 변수명 앞에 _는 별로 쓸 일 없다
  • clear(): size 0으로. 용량은 안변한다.
  • resize -> 사이즈 수정. 기존 size보다 작으면 초과분 삭제. 더 크면 0에 준하는 값으로 초기화해서 생성. capacity보다 크면 메모리 재할당
  • 2차원 벡터 만드려면?
std::vector<std::vector<float>> D2Vector;
D2Vector.assign(4u, vector<float>(8u, 0.f)); // 4 x 8 2차원 배열을 모두 0.f로 초기화

Enum Class, auto, define

고정폭 정수형

  • 사실 char, int 이런것들은 바이트 크기가 (일정 크기 이상) 이지 고정이 아니다.
  • 고정되고 명시된 건
    int8_t / uint8_t
    int16_t / uint16_t
    int32_t / uint32_t
    int64_t / uint64_t
    intptr_t / uintptr_t
    • 언리얼에선 _t 빼고 쓴다.
  • 필요한 헤더 #include <cstdint> 같은 거

enum and enum class

  • 기존의 enumenum 멤버를 int형 변수에 대입, 다른 enum의 멤버와 비교도 가능했음 -> 엉망 됨
    int Number = MyPosition; 이런 식으로 enum to int 암시적 형변환 해줌
    if(MyPosition == ZED) -> 다른 enum 끼리 비교 -> 컴파일 에러 안난다.
  • enum 은 각 멤버에 번호를 할당 해 두는 리스트 같은 거라고 꼭 기억

enum class

  • 명시적 캐스팅 없으면 컴파일 에러. 안전장치가 있는 느낌
    enum class 열거형명: uint8_t 로 기저 정수형을 지정할 수도 있다. 이럼 각 열거형이 8비트 크기로 제한

언리얼 C++

  • Ctrl+Shift+F5!Ctrl+Shift+F5!Ctrl+Shift+F5!

  • 새 액터 생성할 때: .cpp 파일에 #include "폴더명/MyActor.h" 로 되어 있는 거 폴더명 삭제해 두기

    • 한동안은 액터 헤더-cpp 파일을 한 폴더에 보관할 거기 때문에 폴더이동 등에 대응하기 쉽게 폴더명 쪽을 삭제해 두는 게 맞다.

    • Unreal Default가 폴더명을 지정해 두는 것은 Default 폴더관리체계가 publicprivate를 큰 폴더로 노출할 헤더 등등을 폴더단위로 관리하기 때문. 지금 당장은 필요없다.

협업을 위한 Git 기초

  • 딴 사람이 작업한 거 가져오기: Fetch(확인) & Pull(가져오기)
  • 수시로 해서 내 파일들하고 대조해 보기
  • main 브랜치는 작업 완료 전엔 건들지 말기! 항상 브랜치 새로 만들어서 작업-확인 후 merge

로컬 브랜치 만들기

  • Remote Branch는 Github 사이트 가서 만들기:메인 화면에 Branch -> New Branch
    -Checkout Branch - 로컬 브랜치들 우클릭 하면 맨 위에 나오는 그거. 혹은 브랜치들에 더블클릭
    이 브랜치에서 작업하겠다 하는 거

Merge

  • Merge 하기 전에 내가 한 작업들 Commit 하기 (Push는 하지 않는다: 내 로컬에서만 등록)
  • 내가 작업한 브랜치 말고 기존의 Main을 checkout(볼드 처리되게) -> 거기서 내가 작업한 브랜치 우클릭 후 merge XXX into current branch.
    • 이거 전에도 항상 fetch&pull
  • 내가 수정한 내용들 꼼꼼히 확인하고 Merge. 후에 확인하고 main을 push.
  • 만약 merge 후 push 전에 팀원이 뭔가를 올렸다면?
  • 내 main을 temp 브랜치로 옮겨놓고 main 지우고 remote의 main 더블클릭해서 로컬로 받아오기->여기에 내 수정 내용 담긴 브랜치 merge -> 후에 push.

Conflict

  • 같은 파일을 둘이 수정한 경우?
  • 나는 Refac 브랜치에서 수정. 내 로컬 메인에서 Fetch&Pull 해서 수정사항 받아옴. 이 상태에서 merge -> 충돌 일어난다고 경고창 뜸 -> 그냥 경고창 무시하고 OK 누르면
  • 이렇게 경고창 뜸. <<<<<HEAD부터 ====까지가 받아온 내용, ====부터 >>>>Refac까지가 내가 수정한 내용
  • 이후 알아서 팀원과 협의해서 코드 수정하면 됨. 새로 추가된 <<<HEAD, ===, >>>Refac 부분 지우고
  • 이후 stage files 하는 화면에서 Unstaged files에 우클릭 -> Resolve Conflicts -> Mark Resolved. 이후 푸시. 해결!
profile
개발지망생

0개의 댓글