목록c++ (29)
게임 개발 메모장
모듈(module) 모듈(module)이란 프로그램을 구성하는 구성 요소로, 관련된 데이터와 함수를 하나로 묶은 단위를 의미한다. 보통 하나의 소스 파일에 모든 함수를 작성하지 않고, 함수의 기능별로 따로 모듈을 구성한다. 이러한 모듈을 합쳐 하나의 파일로 작성하는 방식으로 프로그램을 만들게 된다. 위처럼 프로그램 코드를 기능별로 나눠서 독립된 파일에 저장하여 관리하는 방식을 모듈화 프로그래밍이라고 한다. 분할 컴파일 작성된 모듈(module)은 개별적으로 컴파일된 후, 링커에 의해 하나의 실행 파일로 만들어진다. 이렇게 하나의 실행 파일을 만들기 위해서 소스 파일을 여러 개로 나누어 개발하는 방식을 분할 컴파일 방식이라고 한다. 최종적인 실행 파일의 생성을 위해서 접근하는 변수나 호출하는 함수가 어디에..
라이브러리 : 이미 만들어진 코드나 바이너리를 가져와서 프로그래밍 할 때 사용할 수 있는 컬렉션. 대표적으로 Standard Library가 있다. 자주 사용하는 등이 이에 해당한다. 1) Header Only : 일반적으로 코드를 받게 되면 헤더 안에 모든 게 정의되어 있어서 이 헤더를 include 하여 사용하는 경우를 말한다. 2) 동적 라이브러리(Dynamic Link Library) - 프로그램 실행 시 필요시만 외부 DLL 파일에서 함수를 참조한다. - 프로그램 실행 시 프로그램 로딩 시간이 단축된다. - 함수 업그레이드 시 해당 DLL만 수정 배포한다. - 소스 외부 유출 방지 효과가 있다. - 실행 파일 만들때 필요한 파일: .h,.lib (*.dll 참조 용) - ..
전역 변수(global variable) 전역 변수란 함수의 외부에서 선언된 변수를 의미한다. 전역 변수는 프로그램의 어디에서나 접근할 수 있으며, 프로그램이 종료되어야만 메모리에서 사라진다. 이러한 전역 변수는 메모리상의 데이터(data) 영역에 저장되며, 직접 초기화하지 않아도 0으로 자동 초기화된다. #include void local(void); int var; // 전역 변수 선언 int main(void) { printf("전역 변수 var의 초깃값은 %d입니다.\n", var); int i = 5; int var = 10; // 지역 변수 선언 printf("main() 함수 내의 지역 변수 var의 값은 %d입니다.\n", var); if (i < 10) { local(); printf("..
빌드(Build)란? 소스 코드 파일을 컴퓨터에서 실행할 수 있는 독립적인 형태로 변환하는 과정과 그 결과를 말한다. 컴파일은 고급언어를 컴퓨터가 이해할 수 있는 저급언어로 바꿔주는 과정 중 하나일뿐 전체적인 과정을 뜻하는게 아니다. 즉, 빌드라는 변환 과정의 큰 틀안에서 동작하는 하나의 과정을 컴파일이라고 하고, 여러 과정이 합쳐진 것이 빌드이다. 또한, 빌드 과정을 도와주는 도구가 Build Tool이다. 실제 코딩을 하고 완성되면 run을 실행하여 결과를 화면에서 볼 수 있는데 이때 Build Tool에 의해 모든 빌드과정이 자동으로 실행되어 우리는 컴파일,빌드라는 개념을 크게 생각하지 않는다. 빌드(Build) : 소스코드 파일을 실행가능한 소프트웨어로 만드는 과정 +) 빌드툴(Build Tool..
코드를 짜다보면, 특정 객체의 클래스 정보를 알기 위해 GetClass 혹은 StaticClass 를 쓰는 것을 볼 수 있다. 그런데 이 둘의 차이는 무엇일까? 한 줄 요악 : StaticClass 는 컴파일 타임에서 UClass 타입의 정보를 얻어오는 것이며, GetClass 는 런타임에서 실제 객체의 클래스를 조회할때 사용된다. AMyActor* ActorPtr = NewObject(...); UObject* ObjPtr = Actor; UClass* MyActorClass = AMyActor::StaticClass(); // AMyActor UClass* ObjectClass = UObject::StaticClass(); // UObject UClass* ActorPtrClass = ActorPtr..
댕글링 포인터란 C 에서 예를 들면 malloc() 함수를 이용해 Heap 공간에서 동적 메모리를 할당한 후에는 free() 함수를 통해 할당된 메모리를 해제 한다. 하지만, 포인터가 여전히 해제된 메모리 영역을 가리키고 있을 때에 문제가 될 수 있는데, 이것을 댕글링 포인터라고 부른다. 문제점 * 메모리 접근시 예측 불가능한 동작을 일으킬 수 있다. * 메모리 접근 불가 시 Segmentation fault가 발생한다. * 잠재적인 보안 위험이 있을 수 있다. 처음에 *ptr을 1로 값을 넣어주고 메모리를 해제해주었는데 ptr은 여전히 처음 할당된 메모리 영역을 가리키고 있다. 여기서 다시 *ptr = 2 처럼 해제된 메모리 영역에 접근하게 되면 문제가 발생할 수 있다. 해결 방법 free() 함수를 ..
참고 : C++ Assert - https://yooyoungjae0627.tistory.com/6 assert 는 일반적으로 참조하고자 하는 변수가 null 인지 아닌지를 체크하는 용도로 자주 사용된다. 실제 개발을 할 때는 프로젝트명으로 된 헤더 파일에 assert 구문을 이용한 커스텀 로그를 만들어 놓는 게 간편하다. 언리얼에서의 assert 종류는 크게 check, verify, ensure 이 있다. // assert 는 DO_CHECK = 1 일때만 실행 // check 는 false 값이면 실행을 중지 check(Mesh != nullptr); checkf(MyPtr, TEXT("MyPtr is nullptr")); // false 이면 로그 출력 checkcodeMyPtr, TEXT("My..
- 디버그 모드에서 디버깅시 어떤 이유 때문에 에러가 났는지를 알 수 있는 유용한 키워드다. - #include 를 해주어야 사용이 가능하다. 1. assert(조건) * 이 조건식이 false 라면 런타임 에러가 나도록 한다. #include using namespace std; int main() { int number = 5; assert(number == 4); return 0; } 1) Release모드 에선 아무런 문제가 없는 코드. 2) 하지만, Debug모드에선 에러를 발생. - assert(number == 4) : number 값이 4가 아닌 5이기 때문. - 프로그래머가 직접 number값이 4가 맞는지 찍어보지 않더라도 number값이 4가 아니면 에러를 발생시켜주므로 디버깅 시 편..
C/C++를 사용하는 이유 중 하나로는 빠른 속도와 커스터마이징 가능한 자원관리 등의 최적화를 위해서 사용할 것이다. 이러한 부분에서 코드를 개발하면서, 컴파일러단에서 부터 코드를 최적화 시켜서 더욱 바르게 실행 할 수 있도록 하려는 노력들이 많이 있다. 이처럼 C/C++ 에서는 내가 원하는대로 코드를 작성하더라도 컴파일러에 의해 최적화 시킬 여지가 있으면 그러한 부분은 컴파일러가 최적화 시켜서 돌아가도록 만들어준다. RVO(Return Value Optimization) #include class Yoo { public: Yoo(const std::string& name) { this->name = name; std::cout