오늘부터 코딩테스트 문제를 풀어보기 시작했습니다.
아직은 0 레벨과 1 레벨 위주의 문제만 풀고 있는데 우선 진행하는 교육과정에서 풀라는 문제 위주로 풀어보았습니다.
쉬운 문제는 정말 쉽게 했지만 몇몇 문제들은 약간 머릿속에서 정리가 안돼서 시간이 걸렸던 문제도 있는 것 같습니다.
정말 신기한건 노트에 손으로 풀기 시작하니 머릿속에서 정리가 안되던 것들도 정리가 잘 되는 그런 경험을 하게 되었습니다.
앞으로 꾸준하게 풀어보겠습니다. :)
10주 완성 C++ 코딩테스트 강의 진행중
- Accumulate() → Vector Array의 합계를 구할 때 사용하는 메서드
- cout의 실수 타입 출력
Cout은 기본적으로 실수를 출력하면 일부분만 출력하게 됩니다.
만약 특정 자릿수까지 반올림해서 출력해야 한다면 다음처럼 작성하면 됩니다.
#include <bis/stdc++.h>
using namespace std;
typedef long long ll;
double a = 1.23456789;
int main()
{
cout << a << '\n';
cout << fixed << setprecision(3) << a << '\n'; // 1.234
cout << fixed << setprecision(8) << a << '\n'; // 1.23456789
}
- Unsigned Int와 Int
Unsigned Int는 음수가 지원이 안되고 아주 큰 양수가 지원이 되는 형입니다.
C++에서는 Vector.Size()를 통해서 확인할 수 있는데 간단하게 확인하기 좋은 예제 같아서 코드로 확인하겠습니다.
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<int> a = {1, 2, 3};
cout << a.size() - 10 << endl;
// unsigned int형이여서 18336744073709551609 와 같은 엄청나게 큰 양수가 나오게 된다.
cout << (int)a.size() - 10 << endl;
// int형으로 형변환 되면서 -7 이 나오게 된다.
return 0;
}
이득우의 언리얼 C++ 강의 수강
이득우의 언리얼 프로그래밍 Part 1 - 언리얼 C++의 이해 6강 진행했습니다.
ERROR: Expected MyGameInstance.h to be first header included.
구현하고자 하는 언리얼 오브젝트의 헤더 파일이 가장 먼저 선언되어야 합니다.
// MyGameInstance.cpp
#include "Student.h" -> ERROR!
#include "MyGameInstance.h" -> 구현하고자 하는 언리얼 오브젝트 헤더
#include "Teacher.h" -> BEST!
언리얼 리플렉션 시스템의 활용
- 리플렉션 시스템을 사용해 언리얼 오브젝트의 특정 속성과 함수를 이름으로 검색할 수 있다.
- 리플렉션 시스템을 사용해 접근 지시자와 무관하게 값을 설정할 수 있다.
- 리플렉션 시스템을 사용해 언리얼 오브젝트의 함수를 호출할 수 있다.
코드로 확인하겠습니다.
// Student.cpp
#include "Student.h"
UStudent::UStudent()
{
Name = TEXT("이학생");
Year = 1;
Id = 1;
}
void UStudent::DoLesson()
{
Super::DoLesson();
UE_LOG(LogTemp, Display, TEXT("%d학년 %d번 %s님이 수업을 듣습니다."), Year, Id, *Name);
}
// Teacher.cpp
#include "Teacher.h"
UTeacher::UTeacher()
{
Name = TEXT("이선생");
Year = 3;
Id = 1;
}
void UTeacher::DoLesson()
{
Super::DoLesson();
UE_LOG(LogTemp, Display, TEXT("%d년차 선생님 %s님이 수업을 강의합니다."), Year, *Name);
}
// MyGameInstance.cpp
#include "MyGameInstance.h"
#include "Student.h"
#include "Teacher.h"
void UMyGameInstance::Init()
{
Super::Init();
UStudent* Student = NewObject<UStudent>();
UTeacher* Teacher = NewObject<UTeacher>();
Student->SetName(TEXT("학생1"));
UE_LOG(LogTemp, Display, TEXT("새로운 학생 이름 %s"), *Student->GetName());
FString CurrentTeacherName;
FString NewTeacherName(TEXT("손사장"));
// 언리얼 리플렉션을 활용해서 "Name"으로 프로퍼티를 찾아오는 부분
FProperty* NameProp = UTeacer::StaticClass()-FindPropertyByName(TEXT("Name"));
if (NameProp)
{
NameProp->GetValue_InContainer(Teacher, &CurrentTeaherName);
UE_LOG(LogTemp, Display, TEXT("선생님 이름 %s"), *CurrentTeacherName);
NameProp->SetValue_InContainer(Teacher, &NewTeacherName);
UE_LOG(LogTemp, Display, TEXT("새로운 선생님 이름 %s"), *Teacher->GetName());
}
UE_LOG(LogTemp, Display, TEXT("========================="));
Student->DoLesson();
// 언리얼 리플렉션을 이용해서 "DoLesson"함수를 가져오는 부분
UFunction* DoLessonFunc = Teacher->GetClass()->FindFunctionByName(TEXT("DoLesson"));
if (DoLessonFunc)
{
Teacher->ProcessEvent(DoLessonFunc, nullptr);
}
}
언리얼 엔진의 기본 프레임워크는 리플렉션을 활용해 구축 되어 있으므로 언리얼 엔진을 이해하기 위해서는 리플렉션 시스템을 이해하는 것이 필요하다.
Visual Studio용 gitignore 적용하기
https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
해당 파일을 루트 디렉터리(깃이그노어를 적용할 폴더의 최상단)에 저장합니다.
프로젝트를 처음 설정할 때 적용했으면 문제가 없으나 이미 프로젝트를 진행하던 중에 적용할 예정이나 변경할 예정이면 기존 프로젝트 파일에는 gitignore 목록이 적용이 안 되는 현상이 있습니다.
이런 경우 적용하기 위해서 다음 명령어를 입력해야 합니다.
git rm -r --cached .
git add .
git commit -m "Apply gitignore"
git push
그러면 기존에 올라간 파일에서도 gitignore 목록을 확인해서 불필요한 파일은 제거됩니다.