디자인패턴
디자인패턴이란 개발 시 반복적으로 등장하는 문제를 해결하기 위한 일반화된 설루션으로서 경험이 많은 개발자들이 많은 프로그램을 구현하면서 고민하는 문제를 정리해서 만든 패턴이다. 디자인 패턴은 크게 3가지로 분리 가능한데
1. 생성패턴 Creaational Patterns : 새로운 것을 만들어내는 방법과 관련된 패턴
2. 구조패턴 Structual Patterns : 여러 부품을 어떻게 조립하고 연결할 지에 대한 패턴
3. 행동패턴 Behavioral Patterns : 부품이 서로 어떻게 상호작용할지에 대한 패턴
생성패턴(중 싱글톤 패턴)
비행기 관리 게임을 만든다고 생각해보자 비행기는 게임 내에 오직 하나만 존재하며 비행기의 초기 좌표는 (0, 0)이어야 한다. 다음과 같은 코드를 작성했다 생각해 보자
#include <iostream>
using namespace std;
class Airplane
{
private:
static Airplane* instance; // 유일한 비행기 객체를 가리킬 정적 포인터
int positionX; // 비행기의 x위치
int positionY; // 비행기의 y위치
//private 생성자 : 외부에서 객체 생성 금지
Airplane() : positionX(0), positionY(0)
{
cout << "Airplane Created at (" << positionX << ", " << positionY << ")"<<endl;
}
public:
//복사 생성자와 대입 연산자를 삭제하여 복사 방지
Ariplane(const Airpane&) = delete;
Airpane& operator=(const Airplane&) = delete;
//정적 매서드 : 유일한 비행기 인스턴스를 반환
static Airplane* getInstance()
{
if(instance == nullptr)
{
instance = new Airplane();
}
return instance;
}
//비행기 위치 이동
void move(int deltaX, int deltaY)
{
positionX += deltaX;
positionY += deltaY;
cout << "Airplane moved to(" << positonX <<", "<<positionY <<")" << endl;
}
//현재 위치 출력
void getPosition() const
{
cout << "Airplane Position : (" << positionX <<", " << positionY<< ")" << endl;
}
};
//정적 멤버 초기화
Ariplane* Airplane:Instance=nullptr;
//메인 함수
int main()
{
//유일한 비행기 인스턴스를 가져옴
Airplane* airplane = Airplane:getInstance();
airplane -> move(10, 20);
airplane -> getPosition();
//또 다른 요청도 같은 인스턴스를 반환
Airplane* sameAirplane = Airplane:getInstance();
sameAirplane -> move(-5, 10);
sameAirpalne -> getPosition();
return 0;
}
예시 코드가 매우 길지만 요약하자면 메인함수를 실행했을 때 getInstance를 두 번 호출해도 똑같은 객체 생성되어 이동한 것을 알 수 있다. 이런 식으로 동작하게 작성하는 것이 싱글톤 패턴이라고 한다. 여기서는 생성자와 소멸자를 private로 선언해서 외부에서 직접 객체를 생성할 수 없게 막았다.
구조패턴(중 데코레이터 패턴)
이번에는 구조패턴 중 데코레이터 패턴에 대해서 알아보자 데코레이터 패턴은 객체에 기능을 동적으로 추가하거나 확장할 수 있도록 해주는 구조패턴이다. 컴파일 시점에 미리 결정된 상속 대신 런타임에 여러 데코레이터를 감싸서 기능을 조합할 수 있다.
행동패턴(중 옵서버 패턴)
옵서버 패턴은 주제(subject) 객체의 상태 변화를 구독하고 그 상태가 변할 때 마다 등록된 옵저버(observer)들에게 자동으로 알림을 전파하는 행동 디자인 패턴이다. 주제와 옵저버 간의 결합도를 낮춰 주제는 자신이 누가 구독했는지만 알고 있을 뿐 구체적인 반응 로직은 몰라도 되며 실행 중에 옵서버를 자유롭게 추가, 제거할 수 있어 유연성이 높아진다. 그리 상태 변화에 따른 반응을 이벤틀 처리해 코드 가독성과 유지성을 향상하는 데에 장점이 있다.
'unreal 5기' 카테고리의 다른 글
| 250901 언리얼엔진 본캠프 20일차 동적할당 (2) | 2025.09.01 |
|---|---|
| 250829 언리얼엔진 본캠프 19일차 문자열 (1) | 2025.08.29 |
| 250826 언리얼엔진 본캠프 16일차 템플릿 (1) | 2025.08.26 |
| 250822 언리얼엔진 본캠프 15일차 클래스와 객체지향적 프로그래밍 (2) | 2025.08.25 |
| 250821 언리얼엔진 본캠프 13일차 구조체 (3) | 2025.08.21 |