⁕ Observer Pattern
객체간의 1대 다 의존 관계를 정의하는 패턴
- 핵심은 주체가 되는 객체의 상태가 변경이 될 때, 해당 상태를 관찰하는 옵저버라는 객체에게 자동으로 알림.
- 옵저버들이 상태에 따라서 적절히 반응하는 것이 핵심이다.
- 상태 변화가 일어나는 시스템이나, 이벤트 기반, 구독 - 알림 시스템에 적합하다.
주체
- 어떠한 상태를 가지며, 상태의 변화가 있을 때, 옵저버한테 알려주는 역할을 한다.
- 옵저버들을 등록하거나 제거하는 메서드를 제공한다.
옵저버
- 주체의 상태를 관찰하는 객체. 주체의 상태가 변경되면 자동으로 통지를 받고 반응한다.
※ 게임에서는 어떻게 쓰일까?
- 퀘스트 시스템 -
- 게임의 플레이어가 특정 퀘스트를 진행하면서 퀘스트의 상태가 변경될 때마다 퀘스트 진행상황을 옵저버가 추적한다.
- 옵저버는 UI에서 퀘스트의 진행 상황을 표시한다거나 NPC나, 시스템에서 변화를 반영하는 방식으로 동작할 수 있다.
- 게임의 플레이어가 퀘스트를 진행할 때, 퀘스트의 상태가 변화되면 그 상태를 추적하는 여러 객체들이
( UI, 퀘스트 로그, NPC) 자동으로 업데이트 되도록 한다.
STACK
- LIFO(Last In First Out) 의 후입선출의 자료구조.
- 데이터 삽입과 제거가 동일한 쪽에서 이루어지며, 최상위 항목에만 접근이 가능하다.
- push : 스택에 새로운 요소를 추가하는 연산. 항상 상단에 추가.
- pop : 최상단 요소를 제거하고 반환.
- top : 스택의 최상단 요소를 반환.
- Empty : 비어있는지 확인.
- 함수호출, 재귀 알고리즘에서 호출 스택 관리할 때, 웹 브라우저의 뒤로가기 기능, 되돌리기 기능 구현
※ stack overflow : 스택이 가득 찬 상태에서 Push 연산을 시도.
stack Underflow : 스택이 비어있는 상태에서 Pop 연산 시도.
Queue
- FIFO(First In First Out)의 구조로 선입선출의 형태를 가진 자료구조.
- 데이터 삽입과 제거가 서로 다른 쪽에서 이루어지며, 큐의 Head에서 데이터를 삽입하고, Tail에서 데이터를 삭제한다.
- BFS(너비 우선 탐색), 메시지 큐 등에서 쓰인다.
버퍼 : 데이터를 한곳에서 다른 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리의 영역.
* 버블 정렬
- 인접한 인덱스를 비교해서 두 인덱스의 값을 교체해서 정렬해주는 방식.
- 정렬할 데이터가 많든 적든 무조건 하나씩 비교하기 때문에 느리다.
- 이중 for문을 사용하게 된다.
#include<iostream>
using namespace std;
void BubbleSort(vector<int>& arr)
{
int size = arr.size();
for(int i = 0; i < size; i++)
{
for(int k = 0; k < size -i -1; k ++)
{
int temp = arr[k];
if(arr[k]>arr[k+1])
{
arr[k] = arr[k+1];
arr[k+1] = temp;
}
}
}
}
int main()
{
vector<int> data(1000);
for(int i =0 ;i<data.size();i++)
{
data[i] = rand() % 1000;
}
BubbleSort(data);
}
* 퀵 정렬
- 분할 정복 알고리즘 중 하나
- pivot : 배열 안에 요소를 선택.
- 분할 : 피벗을 기준으로 작은 값을 왼쪽, 큰 값들을 오른쪽에 위치하고 분할한다.
- 정복 : 분할된 배열에 대해 퀵정렬을 재귀적으로 호출하여 정렬.
* 분할 정복
- 문제를 작은 2개의 문제로 분리하고 각각을 해결한 다음, 결과를 모아서 원래의 문제를 해결하는 전략.
- 큰 문제를 작은 하위 문제로 분할하여 해결하고, 그 하위 문제들의 해답을 조합해서 전체 문제의 해답을 얻는다는 의미.
- 분할 : 원래 문제를 작은 하위 문제로 분할을 하고, 보통 재귀적인 방법으로 이루어진다.
- 정복 : 각 하위 문제를 재귀적으로 해결. 하위 문제의 크기가 충분히 작아서 직접 해결할 수 있는 경우에 해당된다.
- 결합 : 하위 문제의 해답을 결합. 원래 문제의 해답을 얻음.
* 거듭 제곱 알고리즘
- 분할 : 거듭 제곱의 지수를 반으로 나누어 두 개의 하위 문제로 분할
- 정복 : 각 하위 문제를 제귀적으로 해결. 이 때, 크기가 충분히 작으면 직접 계산을 한다.
'C++' 카테고리의 다른 글
C++ 언리얼 기록 - 24.12.13 (1) | 2024.12.13 |
---|---|
C++ Tree / BinaryTree - 24.11.27 (2) | 2024.11.28 |
C++ Singleton, Recursive, State - 24.11.27 (2) | 2024.11.27 |
C++ MAP / Scene - 24.11.26 (2) | 2024.11.26 |
C++ static / extern, SOLID - 24.11.26 (2) | 2024.11.26 |