26
안정적인 정렬 알고리즘?
정렬을 하고 난 뒤에도 같은 key 값을 가진 원소들의 순서가 유지되는가?

- 버블 정렬
- 삽입 정렬
- 병합 정렬
불안정 정렬

- 선택 정렬
- 퀵 정렬
- 힙 정렬
배열 복습
동적 배열 생성?
class Array{public: Array(size_t size) { // 오류 발생. data[size]; // 그냥 size 인덱스 위치를 참조하는 표현식일 뿐, 배열을 생성하지 않음 // 배열을 동적으로 만들고 싶다면 new data[size]가 돼야 함. }private: int data[]; // 클래스 멤버 배열은 반드시 크기가 컴파일 타임에 결정돼야 함};- 가장 중요한 포인트: 클래스 객체 레이아웃은 컴파일타임에 확정돼야 함
- Array 클래스로 객체를 생성하지 않아도 불완전 타입(ill-formed)-타입 시스템 위반으로 컴파일 에러가 발생(
sizeof(array)계산 불가, 객체 메모리 레이아웃 결정 불가)
해결책 1. 템플릿화
#include <iostream>template<size_t size>class Array{public: size_t Size() const { return size; }private: int data[size];};int main(){ Array<10> array; std::cin.get();}- 정적 배열 유지하면서 확장성을 유지하는 방법
해결책 2. 생성자로 통제
class Array{public: Array(size_t size) : size(size) { data = new int[size]; } ~Array() { delete[] data; }private: int* data; size_t size;};- data를 동적 할당한다는 점에서 접근 방식이 다름
해결책 3. std::vector 사용
#include <vector>class Array{public: Array(size_t size) : data(size) { }private: std::vector<int> data;};- 메모리/예외 관리 안전, 복사/이동 안전
std::vector는 왜 사이즈 안정해줘도 괜찮지?
std::vector 내부구조
template<typename T>class vector{ T* begin_; // 힙 메모리 시작점 T* end_; // 사용중인 메모리 끝점 T* capacity_; // 할당된 메모리 끝점};vector객체 자체는 포인터 3개로 이뤄진 고정 크기의 객체- 실제 데이터는
new int[n]로 힙에 동적 할당됨(런타임에 크기 결정) vector객체는 포인터만 가지고, 데이터는 외부(힙)에 존재
const 객체 할당
#include <iostream> template<typename T, size_t size> class Array { public: size_t Size() const { return size; } // 배열을 인덱스로 접근해 읽고, 쓰려면 레퍼런스로 반환해야 한다. T& operator[](size_t index) { return data[index]; } // const T& operater[](size_t index) const { return data[index]; } 가 필요 private: T data[size];}; int main() { Array<int, 10> array; const auto& arrayReference = array; // 컴파일 에러 발생}이유:
const auto& arrayReference의 타입은const Array<int, 10>&으로 const 객체 참조.array의 타입은 연산자 오버로딩의 결과로int data[10]이므로 const 객체에 바인딩 불가
memset의 필요성?
int main() { Array<int, 5> data; memset(data.Data(), 0, data.Size() * sizeof(int)); // memset의 필요?}초기상태:
[ ? ][ ? ][ ? ][ ? ][ ? ]: 값이 정해지지 않은 쓰레기 값(intdeterminate value)
memset 후:
[ 0 ][ 0 ][ 0 ][ 0 ][ 0 ]: 각 int의 모든 바이트가 0
대안:
Array<int,5> data{}; // 모든 원소 0으로 초기화하는 value initialization그래픽스 프로그래밍
Win32 API
- 엔진개발해도 창정도만 띄울 때 쓰고 적극적으로 활용하지 않으니 알아두기만 하면 된다
창 UI
- 기능 개발은 C++에서, UI는 C#에서 나눠 개발하는 추세
- ImGui C++
- QT C++
- immediate gui vs retained gui 그래픽스 특강에선 C#까지 다루기 어려우니 직접 Win32 API를 사용하는 것
GraphicsContext
ID3D11Device* device = nullptr;ID3D11DeviceContext* context = nullptr; // draw call 발생- Device: 리소스 생성
- DeviceContext: 생성된 리소스를 GPU에 설정할 때 사용
- SwapChain: 버퍼 교체
- RenderTargetView: 화면에 그릴 프레임(이미지) 리소스
- View: 특별한 리소스(CPU ↔ GPU)간 소통을 위해 사용하는 Direct3D 전용 개념. CPU와 GPU는 직접적으로 리소스 공유를 하지 못하기 때문에(CPU는 RAM, GPU는 VRAM을 사용, 서로의 작업공간에 접근 못함), CPU가 리소스를 생성하면 GPU도 똑같이 따라 만들 수 있게 소통 창구를 만듦
- Forward Renderer vs. Deferred Renderer https://inhopp.github.io/unity/Unity4/

RenderTargetView
정석적으로는 이미지 속성 구조체를 설정하고 생성하지만 백버퍼용 render target view를 생성하고 swap chain에서 버퍼 불러와서 똑같은 모양으로 생성하는 방법도 있음
DirectX? Direct3D? COM?
https://blog.naver.com/ratoa/220429130028
렌더링 과정
빈 도화지 준비(Engine.BeginScene) → 그리기(Renderer) → 모니터로 전달(Engine.EndScene)
그래픽스 파이프라인

- 모델링 입력을 받는다
- 점 처리를 한다
- 옵션 셰이더 처리를 한다
- 래스터라이저: 도형 안에 픽셀을 몇 개 넣을지 계산한다
- 계산된 픽셀 하나하나마다 픽셀 셰이더로 칠한다
- Output Merger: 픽셀을 합쳐 이미지를 완성한다
WinMain
#ifdef _WIN64int WINAPI WinMain( _In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd) { LaunchEngineStartup(hInstance); return 0;}#elseint main(){ LaunchEngineStartup(GetModuleHandle(nullptr));}#endif