C++/게임 개발자를 위한 C++ 문법 13

템플릿(Template)

⊙ 템플릿의 용도에 대해 이해한다. ⊙ 함수 템플릿과 클래스 템플릿의 사용 방법을 안다. 템플릿(Template)템플릿은 일반화된 프로그래밍(generic programming)을 가능하게 하는 기능이다. 간단히 말해 타입에 구애 받지 않는 일반화된 코드 작성 기법이라고 할 수 있다. 말보다는 예시를 보면 더 빠르게 이해할 수 있다.#include using namespace std;int addInt(int x, int y){ return x+y;}double addDouble(double x, double y){ return x+y;}int main(){ cout매개변수로 들어오는 두 수를 더하는 함수 add를 만들기 위해서는 두 가지 함수를 구현해야 한다. int 타입의 두 수를 더하는 함수와  d..

범위 기반 for 문(ranged-based for statement)

⊙ 범위 기반 for 문의 문법을 안다. ⊙ 범위 기반 for 문을 효율적으로 사용하는 문법을 안다. ⊙ 범위 기반 for 문을 사용할 수 없는 경우를 이해한다. 코드를 보다보면 분명 내가 아는 for문인데 다른 모양을 하고 있는 for문들을 본 적이 있다. 초기화, 조건, 증감의 내용이 아니라 변수 하나를 선언해놓고 거기에 배열이나 벡터 등의 이름만 붙어 있는 것들이 그것이다. 이를 향상된 for문이라 부르는 것을 들어본 적이 있다. 범위 기반 for문(ranged-based for statement)for문은 배열을 반복할 때 편리하고 유리한 방법을 제공하지만, 조금 복잡하고 실수로인해 오류가 발생하기 쉽다. 인덱스를 벗어난다던가, 배열을 끝까지 다 돌지 못한다던가 하는 오류들 말이다. C++ 11에..

디자인 패턴(Design Pattern) : 생성(Creational) 패턴

⊙ 싱글톤 패턴을 이해하고 구현 방법과 활용 방법을 안다. ⊙ 팩토리 메서드 패턴을 이해하고 구현 방법과 활용 방법을 안다. ⊙ 추상 팩토리 패턴을 이해하고 구현 방법과 활용 방법을 안다. ⊙ 빌드 패턴을 이해하고 구현 방법과 활용 방법을 안다. ⊙ 프로토타입 패턴을 이해하고 구현 방법과 활용 방법을 안다. 싱글톤(Singleton) 패턴시스템 내에서 하나의 인스턴스만 존재하도록 보장하는 패턴이다.  구현 방법그럼 어떻게 시스템 내에 인스턴스가 딱 하나만 존재한다는 것을 보장할 수 있을까?그냥 생각나는대로 얘기해보자면, 인스턴스를 하나 만들고, 인스턴스를 또 만드려고 하면 못 만들게 하면 되는 것 아닐까? 못 만들게 하고 대신 전에 만들어 뒀던 걸 가져다 쓰라고 주면 하나 가지고 잘 돌려쓸 수 있을 것 ..

스마트 포인터(Smart Pointer)

⊙ 스마트 포인터의 원리와 필요성에 대해 이해한다. ⊙ 스마트 포인터의 종류가 무엇이 있는지 안다. ⊙ unique_ptr, shared_ptr, weak_ptr의 차이와 특징을 이해한다. 스마트 포인터란?동적으로 할당된 변수나 객체들을 다루면서 가장 주의해야 했던게 무엇인가? "메모리는 쓰고 잘 해제 했는지"일 것이다. 다 좋은데 자동으로 메모리를 관리해주지 않다보니 그 수고를 내가 해야만 한다. 이런 실수들 말이다. 댕글링 포인터(Dangling Pointer) 문제 : 메모리는 이미 해제 되었는데 아직 그곳을 가리키고 있는 포인터(=댕글링 포인터)를 이용해 해제된 메모리 공간에 모르고 접근하는 것이중 해지(Double Free) 문제 : 이미 해제된 메모리를 또 해제하는 것 코드를 짜다보면 충분히 ..

선형 탐색과 이진 탐색

⊙ 선형 탐색과 이진 탐색의 탐색 방법을 안다.⊙ 선형 탐색과 이진 탐색의 각각 유리한 상황을 이해한다. ⊙ 이진 탐색을 구현한다. 선형 탐색선형 탐색이란 정보를 앞에서부터 순서대로 찾는 것을 의미한다. 찾아봐야 하는 자료가 정돈되어 있지 않고 아무런 특징을 발견할 수 없을 때 사용하는 탐색이다. 제작하기 쉽다는 장점이 있지만 찾는 자료가 뒷부분에 있다면 오랜시간을 기다려야 한다는 단점이 있다. 정말 앞에서부터 차례대로 찾는값이 맞는지 확인하는거라 따로 탐색 방법이 이해하기 어렵거나 하지는 않을 것이다.  이진 탐색이진 탐색이란 정렬된 데이터가 있다면 탐색해야하는 자료의 중간값을 찾아 정보를 탐색해가는 방식을 의미한다. 중간값을 판단해서 검색의 범위를 줄여 나가는 방식이기 때문에 모든 값을 다 검사하지 ..

얕은 복사(Shallow Copy) VS 깊은 복사(Deep Copy)

⊙ 얕은 복사(Shallow Copy)가 일어나는 상황과 문제가 되는 상황을 이해한다.⊙ 깊은 복사(Deep Copy)가 일어나는 상황을 이해한다.⊙ 얕은 복사와 깊은 복사의 차이를 이해한다.⊙ 깊은 복사를 구현한다. 복사 생성자클래스에서 다른 객체의 데이터로 초기화된 객체를 생성하는 생성자이다. 모든 클래스는 기본 복사 생성자를 가지지만 개발자가 복사 생성자를 개발할 수도 있다. 복사 생성자는 대입에 경우에는 호출되지 않으며 객체의 초기화의 경우에만 호출된다. 아래 코드의 경우 마지막 줄은 복사 생성자가 호출되지 않는다.Circle c1;Circle c2(c1); // 복사 생성자 호출 OCircle c1;Circle c2=c1 // 복사 생성자 호출 Oc2=c1; // 복사 생성자 호출 X  얕은 복..

배열 자체의 정적 선언과 요소의 개별적 동적 할당

⊙ delete[]과 delete+반복문 사용처의 차이를 이해한다.⊙ 배열 자체의 선언과 요소의 선언의 성질이 다른 상황을 이해한다. 배열 자체의 선언 ≠ 요소의 선언코드 하나만 먼저 보도록 하자.// Animal 타입의 포인터 배열 선언Animal* animals[3];animals[0] = new Dog();animals[1] = new Cat();animals[2] = new Cow();과연 animals는 정적 배열로 선언 되었을까? 아니면 동적 배열로 선언 되었을까? 배열을 선언하는 문장 자체는 포인터 변수 배열을 선언한 것 처럼 보일 뿐 new를 사용하지 않았으니 동적 배열 같아보이지 않는다. 하지만 배열의 요소 하나하나는 new를 이용해서 동적 객체를 선언한 것을 볼 수 있다. 이 경우는 배..

다중 포함 방지

⊙ 헤더파일에 작성하는 다중 포함 방지문을 이해한다. 헤더 파일에 대해서 다시 배우면서 오랜만에 해더 파일을 작성했는데 모든 예제에 앞부분에 같은 문구가 있는 것을 보고 이것이 무엇인지 또 잊어버리기 전에 다시 한번 정리하기로 하였다. 헤더 파일 이중 선언다중포함 방지문은 헤더파일의 이중 선언을 방지하기 위해 필요하다. 말 그대로 헤더파일을 두 번 선언하게 되는 것인데 어떻게 바보도 아니고 헤더파일을 두번 포함 시킬 수 있냐고 할 수 있다. 하지만 이런 문제는 한 스크립트 위에 헤더 파일을 두 번 적는 것 보다는 여러 개의 다른 헤더 파일들에 적혀있는 헤더 파일들이 얽히면서 생긴다. 아래와 같이 메인 함수가 들어간 cpp 파일이 있다고 생각해보자.#include "Circle.h"#include "Hea..

포인터의 개념과 사용

⊙ 포인터 변수가 무엇인지 이해하고 선언하고 사용하는 방법을 안다.⊙ 포인터 대입의 의미 차이를 이해한다.⊙ 직접 참조와 간접 참조의 차이를 안다. 메모리는 프로그램이 실행될 때 사용하는 RAM(Random Access Memory)의 한 부분이다. 메모리는 여러 칸으로 이루어져 있고, 각 칸은 고유한 주소를 가진다. 변수는 메모리의 특정 칸에 데이터를 저장하는 이름표 역할을 한다.int a=10;여기 내가 이렇게 정수형 변수를 선언하면 메모리의 어느 한 칸을 차지하고 들어가서 a라는 이름표를 달고 있는 것이다. 그리고 그 안에 들어있는 값은 10이다. a는 메모리라는 아파트에서 특정 주소를 차지하고 있는 것이다. 우리는 a를 사용하고 싶을 때 그냥 a를 적는다. 그러면 a 안에 들어있는 값인 10을 사..

동적 메모리 할당과 해제

⊙ 힙과 스택의 차이와 용도를 알아보자.⊙ 싱글 변수, 배열, 싱글 객체, 객체 배열의 동적 메모리를 할당하는 방법을 알아보자.⊙ 동적 할당된 변수나 객체를 사용하는 방법에 대해 알아보자.⊙ 동적 메모리 해제의 필요성과 메모리 누수에 대해 알아보자.⊙ 싱글 변수, 배열, 싱글 객체, 객체 배열의 동적 메모리 해제 방법을 알아보자. 동적 메모리 할당동적 메모리 할당은 프로그램 실행 중에 필요한 메모리 크기를 결정하고 할당하는 방법이다. 이 방식은 프로그램의 유연성을 높이며, 데이터의 크기가 런타임에 결정될 때 유용하다. 예를 들어 사용자로부터 입력을 받아 그 크기만큼 배열을 생성하는 경우 동적 메모리 할당을 이용할 수 있다. 동적 메모리 할당은 힙(heap) 영역에 메모리를 할당된다는 뜻이다. 여기서 힙(..