
C++클래스를 새로만들고 Visual Studio에서 BeginPlay()에 로그를 출력하는 문을 넣었다.
void AMyActor::BeginPlay()
{
Super::BeginPlay();
UE_LOG(LogTemp, Warning, TEXT("Hello, World"));
}
문제발생
코드를 정상적으로 적고 액터를 배치하고 언리얼 에디터에서 실행했음에도 로그가 뜨지 않는 문제가 발생했다.
해결
for (int i = 0; i < 6; i++)
{
UE_LOG(LogTemp, Warning, TEXT("%d Num = %d"), i + 1, Numbers[i]);
}
이렇게 출력했는데 완성된 모습을 보니까
[출력 예시]
//[LogTemp]는 실제 출력하는게 아니고 카테고리입니다.
[LogTemp] Lotto Numbers: 3, 15, 22, 30, 35, 44
이렇게 한줄로 출력하는데 아이디어가 생각이 안났다.
FString LottoString = TEXT("Lotto Numbers:");
for (int i = 0; i < 6; i++)
{
LottoString += FString::FromInt(Numbers[i]);
if (i < 5)
{
LottoString += TEXT(",");
}
}
UE_LOG(LogTemp, Warning, TEXT("%s"), *LottoString);
FString을 활용해서 해결했다.
class Circle {
private:
double radius;
public:
Circle(double r) : radius(r) {}
}
만약 이러한 코드가 있고, r이 0보다 큰지 검사하려면 어떻게 할까?
멤버 초기화 리스트가 생성자 본문에 적는것보다 성능이 좋다는것은 알고있지만 검사하는 로직이 필요하기 때문에 만약 나라면 본문에 r이 0보다 크다면이라는 조건문을 달아서 구현했을것같다.
멤버 초기화 리스트에 조건을 달아주기 위한 헬퍼함수를 만드는법을 공부했다.
static double ValidateRadius(double r){
if (r <= 0){
throw std::invalid_argument("Radius must be positive");
}
return r;
}
Circle(double r) : radius(ValidateRadius(r)) {}
이렇게 헬퍼함수를 사용하면 리팩토링할때도 유효하고, 멤버 초기화 리스트의 성능적인 이점도 챙길 수 있을것같다.
vector<int> solution(long long n) {
vector<int> answer;
string tmp = to_string(n);
for (int i = tmp.length()-1; i >= 0; i--){
answer.push_back(tmp[i]-'0');
}
return answer;
}
resize()
메모리 할당 + 모든 요소를 초기화
size와 capacity 모두 변경
vector.resize()
reserve()
capacity만 변경 size는 그대로
메모리만 할당 + 초기화는 안함
vector.reserve(100)
BeginPlay() 로그가 안 뜰 수 있으므로,UE_LOG(카테고리, 심각성, TEXT("포맷"), ...) 형태로 출력 로그를 남기며,for로 여러 줄 로그를 찍을 수 있고,FString을 누적해 TEXT("%s")로 출력하는 방식이 유용하다.ValidateRadius() 같은 헬퍼 함수를 만들어 초기화 리스트에서 검증 로직을 수행하는 패턴을 사용할 수 있다.'0' ~ '9')를 숫자로 바꿀 때는 tmp[i] - '0'처럼 ASCII 오프셋을 빼서 원하는 정수 값을 얻는다.vector::resize() vs vector::reserve()resize(n): size 변경 + 요소 초기화까지 수행(보통 size/capacity가 함께 커짐).reserve(n): capacity만 확보(size는 그대로), 요소 초기화는 하지 않음.resize, “미리 공간만 확보할지”는 reserve를 선택한다.switch 분기 대신 인터페이스/가상함수로 무기(행동) 확장을 수용한다.Bird에 Fly()가 있을 때 펭귄이 예외를 던지는 식이면 치환이 깨져 타입 체크가 필요해진다.DamageSystem이 구체 전략에 직접 의존하지 않고 IAttackStrategy 같은 추상에 의존하도록 주입 구조로 만든다.