목록c++ (29)
게임 개발 메모장
- 그래프 전체를 탐색하는 하나의 방법으로써, 하나의 가지(branch)를 모두 탐색한 이후에 다음 branch로 이동한다. - 넓게 탐색하는 것이 아닌, 깊게 탐색하는 방법이다. - stack 또는 recursive(재귀 함수)로 구현할 수 있다. DFS의 특징 - 정점 방문 시, 반드시 방문 여부(isVisited)를 검사하고, 방문 시 isVisited를 true로 표시한다. 정점 방문 여부를 검사하지 않으면 무한 루프에 빠질 수 있다. - 시간 복잡도(Time complexity) : 인접 리스트로 구현 시 O(V+E) // 인접 행렬로 구현 시 O(V^2) - 재귀 함수로 구현 시, 별도의 자료구조가 필요하지 않으므로 메모리를 아낄 수 있다. (BFS의 경우 queue를 사용해야 하므로 DFS에..
. 가상함수 말고도 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() 연산자로 해당 클래스의 크기를 출력..
1. 람다 함수 정의 및 문법 출력 결과 7 7 람다함수의 기본적인 구조는 아래와 같음 [변수 캡쳐](받을 인자)->리턴타입{함수}(넘길 인자) [변수캡쳐]는 현재 함수에서 사용할 외부 변수들을 뜻함 main함수에 int num;이라는 변수가 있다면 그 변수를 사용하기 위해서는 변수 캡쳐를 사용하여야 한다 변수 캡쳐에 =를 넣으면 해당 함수의 모든 변수를 전부다 사용한다는 의미 &을 넣으면 모든 변수를 참조형으로 받아들인다는 의미이다 [=, &num]처럼 특정 변수만 참조형으로 사용하는 것도 가능 비워두면 아무것도 사용하지 않는다는 뜻 참고로 전역변수는 캡쳐를 해줄 필요가 없다 (받는 인자) 부분은 말 그대로 함수에서 받는 인자들이다 일반적으로 int add(int a, int b); 선언할때 괄호 안..
정답은 가독성, 본인 스타일 대로 하면 된다고 한다. 성능에 차이는 없다. 따라서 나는 다중 if문이 가독성이 좋으므로 그렇게 하겠다. OKKY 답글 1. if문 가지고는 성능에 크게 영향이 없을거에요. 다만 가독성에서 차이가 날거라 생각합니다. 2. if( ) 가 4개가 있는것과 if( 조건 ) if안에 조건이 4개가 있는것의 성능차이를 말씀하신건가요?? 먼저 말씀드리면 성능은 차이가 없습니다. 어셈블리어로 변환되도 같으니까요. if( 조건1 || 조건2 || 조건3 || 조건4) 이런식이 있다면 조건1을 먼저 계산을 할텐데 이때 true가 나온다면 조건2,3,4는 확인하지않고 if문안으로 들어가게 됩니다. &&연산도 마찬가지로 먼저 false가 나와버린다면 더이상의 조건검사를 하지 않아요.