🟦 TIL – 코드카타와 언리얼 C++ 실습을 통해 깨달은 점

🧠 오늘의 핵심 주제

  • 코드카타에서 문제 해결 방식의 단순화와 표준 함수 활용의 중요성
  • 언리얼 C++ 실습을 통해 체감한 엔진 생명주기와 구조적 사고의 필요성
  • 액터 리스폰과 타이머 제어 과정에서 드러난 구조 설계의 중요성
  • “동작한다”와 “이해하고 구현했다”의 차이

✍️ 오늘 한 일 요약

코드카타를 진행하며 문자열에서 정수와 문자를 구분하는 문제를 해결했고,
이 과정에서 직접 조건문으로 처리하던 방식보다 더 간결한 해결 방법이 있다는 것을 알게 되었다.

또한 언리얼 C++ 실습을 통해 액터 스폰 및 리스폰 로직을 직접 구현하면서,
랜덤 좌표 처리 방식, BeginPlay의 호출 구조, 그리고 잘못된 리스폰 설계로 인해
무한 루프와 메모리 폭주를 경험했다.

단순히 기능을 구현하는 것을 넘어서,
왜 이런 문제가 발생했는지 원인을 추적하고 구조를 수정하는 경험을 할 수 있었다.


🔍 코드카타에서 배운 점 – “직접 구현”보다 “잘 쓰는 법”

정수와 문자를 구분해야 하는 상황에서
나는 처음에 유니코드 값을 활용해 if문으로 직접 판별했다.

  • 논리적으로는 맞는 접근
  • 하지만 코드가 길어지고 가독성이 떨어짐

이후 isdigit() 함수의 존재를 알게 되었고,

  • 이미 검증된 표준 함수
  • 한 줄로 의도가 명확하게 드러남

이라는 점에서 훨씬 좋은 해결 방법이라는 것을 깨달았다.


🧩 언리얼 C++ 액터 리스폰 실습에서 겪은 문제

액터를 여러 개 리스폰하는 로직을 구현하던 중,
처음에는 랜덤 좌표 값을 헤더 파일에서 한 번만 계산하도록 설계했다.

그 결과,

  • 여러 액터를 스폰하려 해도
  • 모두 같은 좌표에서 생성
  • 액터 겹침으로 인해 실제로는 하나만 생성되는 오류 발생

👉 원인
랜덤 값이 리스폰 시점마다 갱신되지 않았기 때문

👉 해결
랜덤 좌표 계산을 리스폰 함수 내부로 이동
→ 반복문마다 새로운 좌표 생성
→ 정상적으로 여러 액터 리스폰 성공

이 경험을 통해
“값을 언제 계산하느냐”가 로직에서 얼마나 중요한지 체감했다.


⚠️ BeginPlay와 리스폰 설계로 인한 무한 루프 경험

리스폰 로직을 다루던 중, 가장 큰 실수를 저질렀다.

  • 타 액터가 아닌 자기 자신을 리스폰
  • 그 리스폰 함수를 BeginPlay()에 연결
  • 결과적으로
    BeginPlay → 자기 자신 스폰 → BeginPlay 재호출 → 무한 루프

결국 언리얼 메모리가 폭주하며 에디터가 멈추는 상황까지 발생했다.

문제 해결 과정은 다음과 같았다.

  • 무한 루프 발생 인지
  • BeginPlay의 역할 재확인
  • 리스폰 함수의 개념 정리
  • 자기 자신을 스폰하고 있다는 구조적 문제 발견
  • 구조 수정 및 재실험
  • 정상 동작 확인

이 과정을 통해
엔진의 생명주기 함수는 ‘언제 호출되는지’를 정확히 이해하지 못하면 매우 위험하다는 것을 뼈저리게 느꼈다.


⏱️ 타이머 제어 함수 사용으로 배운 점

타이머를 이용해 액터의 메시와 콜리전을
일정 시간 간격으로 활성화 / 비활성화하는 로직을 구현했다.

이 과정에서,

  • 하나의 타이머로 해결하려다 한계를 느낌
  • 두 개의 타이머 함수로 상태를 분리
  • 반복 여부(true)와 시간 인자를 조절해
    활성화 / 비활성화 쿨타임을 일정하게 유지

하면서 문제를 해결할 수 있었다.

👉 타이머는 단순 반복 호출 도구가 아니라
상태 전환과 흐름 제어를 위한 중요한 설계 도구라는 걸 다시 한 번 느꼈다.


💡 오늘 느낀 점

  • 문제를 푸는 것과 문제를 잘 푸는 것은 다르다
  • 표준 함수와 엔진 구조는 괜히 존재하는 게 아니다
  • 언리얼 C++에서는 기능보다 생명주기와 구조 이해가 우선
  • 무한 루프, 메모리 폭주는 구조를 잘못 이해했을 때 바로 나타난다
  • 삽질 과정이 곧 실력이 된다

오늘은 단순히 “된다 / 안 된다”를 넘어서,
왜 안 됐고, 왜 이렇게 고쳐야 했는지까지 이해한 하루였다.

'TIL' 카테고리의 다른 글

26.01.27_TIL  (0) 2026.01.27
26.01.19_TIL  (0) 2026.01.19
26.01.13_TIL  (0) 2026.01.13
Team7_KPT회고록  (0) 2026.01.07
26.01.06_TIL  (0) 2026.01.06