3-1. 디자인 패턴
개발 시 반복적으로 등장하는 문제를 해결하기 위한 일반화된 솔루션
여러 패턴들이 있지만,
생성패턴 - 싱글톤 패턴
구조패턴 - 데코레이터 패턴
행동패턴 - 옵저버 패턴
을 알아볼 예정

1. 생성 패턴(Creational Patterns)
- 새로운 것을 만들어내는 방법과 관련된 패턴
- 객체 생성을 제한을 두거나 특정 방법으로 객체를 생성하고 싶을 때 사용
- 생성 패턴 중에서 싱글톤 패턴을 배울 예정
싱글톤 패턴 구현
1) 생성 및 대입을 private 으로 함
2) getInstance() 를 통해서만 인스턴스를 받음


정적 메서드: 유일한 비행기 인스턴스를 반환
static Airplane* getInstance()
{
if (instance == nullptr) → 인스턴스가 null이면
{
instance = new Airplane(); → 객체를 생성하고
}
return instance; → 기존에 생성했던 것을 반환
→ 비행기는 하나만 존재하게 됨


Airplane Created at (0, 0) 처음 위치
Airplane moved to (10, 20) 이동 된 좌표
Airplane Position: (10, 20) 이동 된 후 위치
Airplane moved to (5, 30)
(10, 20) 에서 (-5, 10) 을 이동하여 (5, 30)이 됐다는 것은
이전에 Airplane의 getInstance와 동일한 객체를 가지고 있다는 뜻
Airplane Position: (5, 30) 이동 된 후 위치
2. 구조 패턴(Structual Patterns)
- 여러 부품을 어떻게 조립하고 연결하는 방법에 대한 패턴
- 여러 개의 객체들의 구조를 어떻게 구성할지가 이 패턴의 주 관심사
- 구조 패턴 중에서 데코레이터 패턴을 배울 예정
데코레이터 패턴 구현
1) 본 피자 클래스가 있고, 데코레이터 클래스가 추가로 있음
2) 데코레이터 클래시는 피자 객체를 감싸며 동적으로 새로운 기능을 제공
3) 원하는 토핑을 조합하여 피자를 구성할 수 있고, 새로운 토핑을 추가하면 기능 확장이 쉽게 가능




3. 행동 패턴(Behavioral Patterns)
- 부품이 서로 어떻게 상호작용할지에 대한 패턴
- 특정 객체가 변할 때 다른 객체들에 이 상태를 어떻게 전달할지를 고민함
- 행동 패턴 중에서 옵저버 패턴을 배울 예정
데이터가 수정이 될 때마다 내용이 업테이트가 되어야함
→ 업데이트를 효율적으로 하는 것 (옵저버 패턴의 핵심)
옵저버 패턴 구현
1) Subject : 상태를 관리하고, 변경되었음을 옵저버에게 알림
2) Observer : Subject 를 관찰하며 상태 변경 시 반응
3) 연결 구조 : Observer 들은 Subject 에 등록하고 변경이 발생하면 알람을 받음






옵저버 패턴의 흐름
subject 클래스 → observer 를 등록 → subject 클래스의 값 변경 감지
→ notify를 각 observer에 등록 → 각 observer는 그에 대한 반응을 함
(더 많은 패턴들이 존재하기에 알면 좋음)
3-2. Unreal Engine 기본개념
1. 언리얼 엔진 특징
1) 실시간 렌더링
언리얼 엔진은 실시간 렌더링 성능이 뛰어나서 높은 퀄리티의 그래픽을 구현 가능
2) 블루프린트(Blueprint)
블루프린트는 코딩 없이 노드를 연결해서 게임 로직을 만들 수 있는 기능
장점:
- 초보자도 쉽게 사용 가능
- 눈으로 보면서 개발 가능
- 실시간 테스트 가능
3) 멀티 플랫폼 지원
한 번 개발하면:
- PC
- 콘솔
- 모바일
등 여러 플랫폼으로 배포 가능
4) 활성화된 커뮤니티
언리얼 엔진은 자료와 튜토리얼이 굉장히 많음
모르는 부분이 생기면 검색만 해도 대부분 해결 가능
2. 라이브 코딩 비활성화 권장
- Visual Studio와 충돌
- 빌드 오류
권장사항으로 아래 라이브 코딩 활성화는 해지 (그림에는 선택되어 있지만 해지하라는 의미)
Visual Studio와 충돌해서 에러를 발생시키는 경우가 많음

3. Actor
언리얼 엔진에서 게임 월드에 배치되는 모든 객체
예시:
- 플레이어
- 몬스터
- 아이템
- 자동차
- 총기
- 건물
전부 Actor 기반
4. Actor 생성 방법
생성 순서:
새 C++ 클래스 생성
→ Actor 선택
→ 클래스 이름 입력
→ 생성
생성 시
- .h
- .cpp
파일이 자동 생성
5. UE_LOG
언리얼 엔진에서 로그를 출력할 때 사용하는 함수임
C++의 cout 느낌이라고 생각하면 됨
UE_LOG 심각도 종류
| 종류 | 설명 |
| Log | 일반 로그 (흰색) |
| Display | 강조 정보 (파란색) |
| Warning | 경고 (주황색 또는 노란색) |
| Error | 오류 (빨간색) |
| Fatal | 치명적 오류, 이후 프로그램 종료 (빨간색) |
UE_LOG의 다양한 예시
void TestUELogExamples()
{
// 1. 일반 로그(Log) - 개발자가 디버깅을 위해 사용하는 기본 메시지
UE_LOG(LogTemp, Log, TEXT("Game has started. Player has joined the game."));
// 2. 중요 정보(Display) - 항상 표시되는 정보 메시지
FString PlayerName = TEXT("Player1");
UE_LOG(LogTemp, Display, TEXT("Welcome, %s! Enjoy the game."), *PlayerName);
// 3. 경고(Warning) - 잠재적 문제가 있을 때 경고를 출력
int PlayerHealth = 50;
if (PlayerHealth < 100)
{
UE_LOG(LogTemp, Warning, TEXT("Player health is below maximum: %d"), PlayerHealth);
}
// 4. 오류(Error) - 실행에 영향을 줄 수 있는 문제
int AmmoCount = 0;
if (AmmoCount == 0)
{
UE_LOG(LogTemp, Error, TEXT("No ammo left! Player cannot shoot."));
}
// 5. 문자열 결합 - 다양한 데이터를 한 메시지로 출력
int Score = 150;
int TimeLeft = 120;
UE_LOG(LogTemp, Log, TEXT("Score: %d, Time Left: %d seconds."), Score, TimeLeft);
// 6. 부동소수점(Floating Point) 값 출력
float PlayerSpeed = 325.5f;
UE_LOG(LogTemp, Display, TEXT("Player speed: %.2f units/sec"), PlayerSpeed);
// 7. 여러 심각도 사용 - 게임 상태에 따라 로그를 구분
bool bIsPaused = true;
if (bIsPaused)
{
UE_LOG(LogTemp, Warning, TEXT("Game is currently paused."));
}
else
{
UE_LOG(LogTemp, Log, TEXT("Game is running normally."));
}
// 8. 디버깅용 메시지 (Developer Note)
UE_LOG(LogTemp, Display, TEXT("This message is for developers to debug the game state."));
}
'게임 개발자를 위한 C++ 문법' 카테고리의 다른 글
| 게임 개발자를 위한 C++ 문법 / 2-4 (0) | 2026.05.15 |
|---|---|
| 게임 개발자를 위한 C++ 문법 / 2-3 (0) | 2026.05.13 |
| 게임 개발자를 위한 C++ 문법 / 2-1 ~ 2-2 (0) | 2026.05.06 |
| 게임 개발자를 위한 C++ 문법 / 1-5 ~ 1-6 (0) | 2026.05.04 |
| 게임 개발자를 위한 C++ 문법 / 1-1 ~ 1-4 (0) | 2026.04.30 |