목록언리얼 엔진/C++ (26)
게임 개발 메모장
동기식 (Synchronous) 작업을 하나 시작하고 완료되면 다음 작업을 시작한다. 예를 들어, 서버에 요청을 보낸 뒤에 클라이언트에서 결과를 받아야 다음 작업을 시작하는 방식 비동기식 (Asynchronous) 서버에 요청을 보낸 뒤에 동기 방식과 달리 바로 다음 작업을 시작한다. 동기 방식에 비해서 자원을 효과적으로 처리할 수 있다. 따라서, 동기 방식과 달리 작업이 끝나면 이를 알 수 있도록 처리 결과를 반환하는 콜백 함수가 필요하다.
* TTuple은 2개 이상의 값을 하나의 변수에 담기 위해 사용됨. * UObject가 아니여서 UPROPERTY나 UFUNCTION으로 사용할 수 없음. 사용 예시 코드 결과 화면 한 가지 특이점이 있다면 Test3에 있는 Key와 Value는 자료형이 2개인 TTuple에서만 사용 가능하다. 아마도 TMap에 있는 TTuple로 인식하는 듯 하다. 담겨진 값을 설정하거나 가져오고자 할 때 모두 Get 함수를 사용하면 된다. 참조자로 넘겨주기 때문이다.
C언어에는 lvalue(left value), rvalue(right value) 라는 개념이 존재한다. 이 왼쪽 값, 오른쪽 값이란 단어의 의미는 매우 직관적으로 등호 (=) 의 왼쪽에 있으면 lvalue , 오른쪽에 있으면 rvalue 이다. 대입받는 값, 대입되는 값이라고도 할 수 있다. lvalue 표현식 이후에도 사라지지 않는 값. 이름을 지니는 변수. rvalue 표현식 이후에는 사라지는 값. 임시 변수. 굵은 밑줄이 쳐진 것이 rvalue 이다. x+y 따위는 실제 변수가 아니라 임시 변수를 생성하여 (레지스터인지 메모리인지)에 저장, 사용한다. 이 값은 일반 변수와 마찬가지로 int 등의 타입을 가지고 있지만 계산이 끝나면 사라지는데 이것이 rvalue 이다. 그리고 명시적으로 선언하여 '..
. 가상함수 말고도 virtual 키워드를 붙여줘야 할 대상이 하나 더 있다. 그것은 바로 '소멸자'이다. 즉, virtual 선언은 소멸자에도 올 수 있다. 가상 소멸자(Virtual Destructor) virtual로 선언된 소멸자를 가리켜 '가상 소멸자'라 부른다. 다음의 예를 살펴보자. 실행결과에서도 보이듯이 객체의 소멸을 First형 포인터로 명령하니, First클래스의 소멸자만 호출되었다. 따라서 이러한 경우에는 메모리의 누수(leak)가 발생하게 된다. 그러니 객체의 소멸과정에서는 delete 연산자에 사용된 포인터 변수의 자료형에 상관없이 모든 소멸자가 호출되어야 한다. 그리고 이를 위해서는 다음과 같이 소멸자에 virtual 선언을 추가하면 된다. 가상함수와 마찬가지로 소멸자도 상속의 ..
1. 가상 상속(virtual inheritance) 이란?? C++에선 다중상속을 지원합니다. JAVA는 다중상속을 막고 있지요. 다중상속은 장점과 단점이 존재합니다. 장점으론 객체지향의 상속성을 좀 더 유연하게 해주는 역할을 하죠. 하지만 단점은 다이아몬드 상속구조를 띌 수 있으며, 이는 메모리 낭비, 성능저하로 이어질 수 있습니다. 그럼 다음 그림과 같은 형태로 상속을 진행해 보겠습니다. 그림 코드 #include class A { public: A() { printf("A 생성자\n"); } ~A() { printf("A 소멸자\n"); } int A_num; }; class B : public A { public: B() { printf("B 생성자\n"); } ~B() { printf("B 소..
오버라이딩(Overriding) 가상함수를 이해하기 위해선 오버라이딩(Overriding) 에 대해서 알아야 한다. class Parent { void show() { printf("this is parent\n"); } } class Child : public Parent { void show() { printf("this is child\n"); } } class ChildChild : public Child { void show() { printf("this is childchild\n"); } } int main() { Parent * p = new Parent; Child * c = new Child; ChildChild * cc = newChildChild; p->show(); c->show(..
가변 인자(Variable argument)란 말 그대로 고정되지 않은 인자를 말한다. C언어의 printf() 함수처럼 정해지지 않은 개수의 인자를 받아야 할 때 사용한다. 가변 인자는 아래와 같이 인자를 ... 표시로 나타낸다. void func(int ...) { } 위 표현은 int 타입의 매개변수를 사용자가 입력한 만큼 받겠다는 의미이다. 따라서 함수 호출 시 아래와 같이 사용할 수 있다. func(1, 3, 2, 5, 8); func(1, 2); func(4); func(5, 1, 4, 8); ... 가변인자 템플릿(Variadic template) C++11부터 지원되는 문법 가변인자 템플릿(클래스 템플릿, 함수 템플릿)의 기본 모양 가변인자 템플릿의 인자 "Types"는 여러개의 타입을 나..
포인터란? 포인터는 메모리의 주소를 가지고 있는 변수이다. 주소 값을 통한 메모리 접근을 한다. ( 간접 참조 ) 레퍼런스란? 레퍼런스 = 참조자 ( C++ 문법 ) 참조자는 자신이 참조하는 변수를 대신할 수 있는 또 하나의 이름이다. 즉, 변수에 별명(별칭)을 하나 붙여주는 것이다. 변수 명을 통해서 메모리를 참조한다. ( 직접 참조 ) Num이 변수의 이름이면, Ref는 Num의 별명이라는 뜻이다. Num과 Ref는 동일한 메모리 공간을 참조한다. 포인터와 레퍼런스의 차이 1. NULL 초기화 포인터는 NULL 초기화를 할 수 있지만, 레퍼런스는 NULL 초기화를 할 수 없다. 레퍼런스는 반드시 선언과 동시에 초기화를 해야한다. 이러한 특성때문에, 포인터는 가리킬 대상을 변경할 수 있지만 레퍼런스는 ..
1. 깊은 복사와 얕은 복사란? 깊은 복사(deep copy)와 얕은 복사(shallow copy)는 객체를 복사하는 두 가지 다른 방법이다. 깊은 복사는 원본 객체와 완전히 독립적인 새로운 객체를 생성하여 값들을 복사하는 것을 의미하며, 얕은 복사는 원본 객체와 복사된 객체가 같은 메모리를 공유하는 방법이다. 2. 깊은 복사와 얕은 복사의 차이점 깊은 복사와 얕은 복사는 복사된 객체의 변경이 원본 객체에 영향을 미치는지 여부로 구분된다. 깊은 복사는 복사된 객체가 원본 객체와 독립적으로 동작하며, 얕은 복사는 복사된 객체와 원본 객체가 메모리를 공유하여 변경이 서로 영향을 미친다. 3. 깊은 복사의 활용 예제 4. 얕은 복사의 활용 예제 5. 깊은 복사와 얕은 복사를 선택하는 기준 객체가 동적으로 할당..
. 위 코드 main함수를 보게 되면 Dog stackDog가 있다. 해당 객체는 stack영역에 저장이 된다. 다음은 Dog* heapDog는 포인터이다. stack영역에 포인터를 생성하고 heap영역에 객체를 생성한 뒤 포인터가 heap영역의 객체를 가리키는 식으로 메모리가 할당이 된다. 마지막으로 Dog staticDog는 static메모리 공간에 할당이 된다. 이어서 클래스 혹은 구조체의 Memory Alignment에 대해서 설명한다. Memory Alignment는 메모리가 할당이 어떤 식으로 할당이 되는지에 대한 룰이다. 구조체의 멤버 변수들의 자료형의 크기에 따라 메모리를 할당을 어떻게 해줄까에 대한 얘기이다. Case 1 main함수에서 sizeof() 연산자로 해당 클래스의 크기를 출력..