본문 바로가기

게임개발 수업

(20)
STL Deque & STL Map Deque란 무엇인가? - double ended queue 의 줄임말이다. 작동 방식은 Vector와 동일하다. Vector를 포인터 배열로 한번더 감싼 것이라 생각하면 된다. Vector와 다르게 배열이 가득차면 새로운 포인터 배열을 만들어서 거기에 insert하기 때문에 vector처럼 내용을 복사하지 않는다. Map은 무엇인가? Map은 key와 value를 가지고 있는 자료구조이다. key를 Tree구조로 가지고 있기 때문에 정렬되어 있고(오름차순), key에 대한 중복을 허용하지 않는다. Tree구조의 특징을 그대로 가지고 있기 때문에 random access는 지원하지 않고, 삽입 삭제 및 찾기의 시간복잡도가 o(log n) 이다.
수학-벡터 벡터란 무엇인가? - 크기와 방향을 같이 갖는 양을 표현하는 것을 벡터라 한다. 크기만 표현한 것은 스칼라 라고 한다. 단위벡터 - 벡터의 크기가 1인 경우를 단위 벡터라 한다. 단위 벡터는 방향을 나타내는데 조금 더 집중하고 있다라고 이해하면 된다. 0벡터 - 크기가 0인 벡터, 방향은 고려하지 않는다. ex) |AA ->| = 0 위치벡터 - 시점이 통일된 벡터 평면 벡터의 성분 시점을 좌표의 0점으로 두고 벡터를 좌표를 표현하듯이 표현하는 것을 성분 벡터라 한다. 성분으로 표현하면 벡터들의 덧셈 뺄셈 실수배가 쉬워진다. 벡터의 길이(스칼라) - 벡터는 크기와 방향을 갖고, 스칼라는 오직 크기만 갖는다. 이 말은 회전변환(바라보는 관점, 혹은 시작점이 변하면)하면 벡터는 변하고, 스칼라는 변하지 않는..
행렬 행렬이란 무엇인가? - 수나 문자를 직사각형 형태로 배열하여 괄호로 묶어 나타낸 것 단위 행렬 - 대각 성분이 1이고 나머지 성분이 0인 행렬 ex) 10 01 100 010 001 전치 행렬 행과 열을 바꿔서 만드는 행렬 ex) 123 - > 14 456 25 36 0행렬 모든 성분이 0인 행렬 역행렬 행렬 A가 있다고 할 때, A*B = I(단위행렬) , B*A = I 이 된다면 B는 A의 역행렬이라 한다. 행렬의 곱셈 A, B 행렬이 있다고 할때, A행렬의 열과 B행렬의 행이 같을 때만 곱셈이 가능하다. A(m*n) B(n*l) = A행렬의 열n과 B행렬의 행n이 같으므로 가능하다. 곱셈의 결과는 A행렬의 행m * B행렬의 열l 로 크기가 정해진다. 따라서 C는 m*l 행렬이 된다. A B C a1..
비트연산과 쉬프트연산 비트연산이란 무엇인가? 비트 + 연산 이다. 연산(+,-,*,/)을 하는 것인데, 이를 비트로 한다는 뜻이다. 예를 들어 int a가 있다고 가정해보자. int는 4byte이다. 1byte 1byte 1byte 1byte (부호비트0)000 0000 0000 0000 0000 0000 0000 0000 메모리에는 실제로 이렇게 저장되어 있다. 그래서 int의 경우 32bit로 이루어져 있고, 이중 맨 앞 부호비트 하나를 뺀 31bit로 값을 표현할 수 있다. 비트연산이란 이 비트값을 직접적으로 연산한다는 뜻이다. 비트 연산은 & and 연산 | or 연산 ^ xor 연산 ~ not 연산 >> 오른쪽으로 이동 연산 > 16) & 0x0000FFFF; y좌표 값 x좌표값 0000 0000 0000 0000 ..
삼각비, 삼각함수 삼각비, 삼각함수란 무엇인가? 나와 어떤 물체의 위치 사이의 거리를 표현한 것이 삼각비와 삼각함수이다. A(나)와 C(물체)의 위치간 거리를 표현한 것이다. C에서 내가 있는 위치까지 수직으로 내리면 B가 나온다. 그림에서 보듯이 직각삼각형이 나타난다. 이때 A->C 거리 b, C->B 거리 a, A->B 거리 c 의 길이는 일정한 비율을 가지는 데 이것을 삼각비라 한다. 두 삼각형은 크기가 다르지만 a와 c사이의 각도(θ)가 같다면 각 거리는 동일한 비율을 가지고 있고, 이를 비례식으로 풀면 내가 다른 하나의 직각삼각형의 거리를 몰라도, 하나의 직각삼각형의 거리만 안다면 나머지도 알 수 있게 되는 것이다. 하지만 삼각비는 각도(θ)가 0 < 각도(θ) < 90 까지 밖에 표현을 할 수 없다. 그래서 그..
WINAPI 윈도우 프로그래밍의 동작 방식을 알기 위해서 먼저 구성 요소는 다음과 같이 4가지로 이루어져 있습니다. 메세지(Message) 메세지 큐(Message Queue) 메세지 루프(Message Loop) 윈도우 프로시저(Window Procedure) 메시지(Message) 메시지는 윈도우에 발생하는 모든 이벤트(사건)을 의미합니다. 키보드로 입력하고, 마우스로 클릭하는 것 뿐만 아니라, 마우스가 이동하는 등의 사소한 이벤트들을 모두 메시지로 관리합니다. 윈도우 내에서 발생하는 대부분의 이벤트들은 이미 미리 정의가 되어 있습니다. 그렇다면 개발자들이 이런 사소한 이벤트들을 모두 코드로 관리해야할까요? 당연히 그렇지 않습니다. 각 윈도우에 어떤 사건이 발생하는지 지속적으로 확인하고 메시지로 만들어서 처리하는..
함수 포인터 함수 포인터란 포인터 변수에 함수를 담는 다는 이야기다. 함수 포인터를 사용하는 이유는 무엇일까? 기본적으로 함수는 코드영역에 저장된다. 코드영역에 저장된다라는 의미는 컴파일 타임에 결정된다는 뜻이다. 이는 우리가 함수를 동적으로(런타임때) 무언가를 처리하기 어렵다는 의미이다. 함수 포인터를 사용하지 않아도 된다. 그냥 함수를 여러개 만들어 두고, 상황에 따라 적절한 함수를 호출해도 된다. 실제로 내가 실무에서 함수포인터를 써본 적은 한번도 없다. 아무 문제 없다. 다만 함수포인터를 적절히 사용한다면 코드 재사용성이 올라가고, 이는 유지보수를 쉽게 만들어 준다는 장점이 있다. 함수 포인터와 비슷한 역할을 하는 것이 있다. 이다. template도 함수 포인터와 마찬가지로 함수를 조금 더 동적으로 처리하기..
vector push_back 과 emplace_back의 차이 push_back과 emplace_back은 완전히 같다. l-value가 들어오면 copy를 수행한다. r-value가 들어오면 move를 수행한다. emplace_back은 여기에 추가적으로 std::allocator_traits::construct를 제공한다. 이말이 무슨 뜻이냐면 생성자 파라미터만 적으면 copy,move를 하지 않고 추가해준 공간에 직접 객체를 생성한다는 이야기이다. class Test { public: Test() : a(0) { cout
팩토리 패턴 팩토리 패턴이란 oop 디자인 패턴 중 하나를 말한다. 디자인 패턴이란 무엇인가? - 디자인 패턴이란 oop의 4가지 규칙(추상화, 상속화, 캡슐화, 다형성)과 5가지 원칙 • 단일 책임 원칙 (SRP : Single Responsibility Principle) • 개방 폐쇄 원칙 (OCP : Open/Closed Principle) • 리스코프 치환 원칙 (LSP : Liskov’s Substitution Principle) • 인터페이스 분리 원칙 (ISP : Interface Segregation Principle) • 의존관계 역전 원칙 (DIP : Dependency Inversion Principle) 을 잘지키기 위해 만들어진 일종의 공식 같은 것이다. 디자인 패턴을 꼭 사용해야 하는가? ..
객체 복사 프로그래밍을 하면서 알게 모르게 객체 복사를 많이 사용한다. class Dog{ public: string name; int age; } void main(){ Dog dog = Dog(); Dog dog2 = dog; Dog dog3; dog3 = dog; } main에서의 대입은 우리가 흔하게 사용하는 코드이다. dog2에 dog을 넣고, dog3에 dog을 넣는 것 모두 복사에 해당한다. 무엇을 복사하느냐? Dog()이라는 인스턴스의 주소값을 복사하는 것이다. 메모리 번지수​ 변수명​ 값​ 100​ Dog 인스턴스​ String name​ Int age​ 200​ dog​ 100(주소값)​ 300​ dog2​ 100(주소값)​ 400​ dog3​ 100(주소값)​ 이렇게 주소값만 가지는 것을 얕은 ..