전체 글 224

디자인패턴) MVC(Model-View-Controller) 패턴

MVC 패턴데이터, 화면, 로직을 세 역할로 분리하는 패턴 Model데이터 그 자체, 화면이 어떻게 보이는지 전혀 모름 View화면 출력만 담당, 데이터를 직접 건드리지 않는다. ControllerModel과 View를 연결합니다. 입력을 받아 Model을 수정하고, 결과를 View에 반영 사용자가 입력을 했다 -> Controller (입력 처리) -> Model (데이터 변경) -> Controller (변경 감지) -> View (화면 갱신) 장점1. 역할 분리로 유지보수 용이2. 재사용성 -> 같은 Model을 다른 view로 표현 가능3. 테스트 용이 -> Model은 UI 없이 독립적으로 테스트 가능 단점1. Controller가 비대해짐 -> Model과 View를 연결하는 로직이 ..

디자인패턴 2026.05.08

디자인패턴) 템플릿 메서드 패턴(Template Method Pattern)

템플릿 메서드 패턴전체 알고리즘의 골격은 부모 클래스가 정의하고, 세부 구현은 자식이 채우는 패턴 C++ 템플릿 메서드 패턴 구현// AEnemy (부모) - 골격 정의void AEnemy::BaseAttack(){ // 1. 쿨다운 확인 (공통 - 자식이 바꿀 수 없음) if (!bCanAttack) return; // 2. 몽타주 선택 후 재생 (자식마다 다름) UAnimMontage* Montage = SelectAttackMontage(); // ← 훅 메서드 // 3. 쿨다운 시작 (공통 - 자식이 바꿀 수 없음) bCanAttack = false; GetWorld()->GetTimerManager().SetTimer( AttackTimerH..

디자인패턴 2026.05.08

디자인패턴) 컴포지트 패턴(Composite Pattern)

컴포지트 패턴개별 객체와 객체들의 묶음(그룹)을 동일하게 다루는 패턴 컴포지트 패턴은 트리 구조로 표현된다. 그룹 A를 실행하면 트리를 따라 내려가 D, E, C 전부 실행된다. C++ 컴포넌트 패턴 구현// 공통 인터페이스 (단일 & 그룹 모두 이걸 구현)class ISkillComponent{public: virtual void Execute() = 0; virtual float GetCost() = 0;};// 단일 객체 (Leaf)class USingleSkill : public ISkillComponent{ FString Name; float ManaCost; void Execute() override { UE_LOG(LogTemp, Log,..

디자인패턴 2026.05.08

디자인패턴) 데코레이터 패턴(Decorator Pattern)

데코레이터 패턴기존 객체를 수정하지 않고,감싸서 기능을 동적으로 추가하는 패턴 캐릭터에 버프를 추가한다고 가정ACharacter├── ACharacter_SpeedBuff (속도 버프)├── ACharacter_AttackBuff (공격력 버프)├── ACharacter_SpeedAttackBuff (속도 + 공격력 버프)├── ACharacter_ShieldBuff (방어 버프)├── ACharacter_SpeedShieldBuff (속도 + 방어 버프)├── ACharacter_AttackShieldBuff...└── ... 조합이 늘어날수록 클래스 폭발 C++ 데코레이터 패턴 적용// 공통 인터페이스class ICharacterStats{public: virtua..

디자인패턴 2026.05.08

디자인패턴) 옵저버 패턴(Observer Pattern)

옵저버 패턴어떤 객체의 상태가 변하면, 그것을 구독하고 있는 객체들에게 자동으로 알려주는 패턴 캐릭터의 HP가 바뀔때 관련된 모든 시스템을 직접 호출해야 한다.void AEnemy::TakeDamage(float Damage){ CurrentHP -= Damage; // HP가 바뀔 때마다 관련된 걸 전부 직접 호출 HPBarWidget->UpdateHP(CurrentHP, MaxHP); // UI 갱신 MinimapSystem->UpdateEnemyState(this); // 미니맵 갱신 QuestSystem->CheckKillCondition(this); // 퀘스트 확인 AchievementSystem->Check(this); /..

디자인패턴 2026.05.08

디자인패턴) 팩토리 메서드, 추상 팩토리 패턴

팩토리 메서드객체를 만드는 메서드를 서브클래스에서 결정하도록 하는 패턴부모 클래스는 "뭔가를 만들어라"라고 정의만 하고, 실제로 뭘 만들지는 자식 클래스가 결정하는 것 // 부모: "적을 만들어라" 라고 선언만 함class ASpawner{public: // 팩토리 메서드 (서브클래스가 구현) virtual AEnemy* CreateEnemy() = 0; // 공통 로직은 여기서 처리 void SpawnEnemy() { AEnemy* Enemy = CreateEnemy(); // 뭘 만들지는 자식이 결정 Enemy->SetActorLocation(SpawnPoint); Enemy->InitializeAI(); }};// 자식: 실제로..

디자인패턴 2026.05.08

디자인패턴) 싱글톤(Singleton)

싱글톤 프로그램 전체에서 인스턴스가 딱 하나만 존재하도록 보장하는 것 게임에서 보통- 게임 상태 관리(일시정지, 게임오버 등)하는 게임 매니저- BGM 등을 재생하는 사운드 매니저- 세이브 파일을 관리하는 저장 시스템등등은 전역에서 하나만 있어야 한다. 두개가 있다면 충돌이 일어날 수도 있어서 위험.이러한 충돌을 막기 위해, 클래스는 무조건 하나만 만들어지도록 강제하는 것이 싱글톤 패턴이다. C++기본 구현class SoundManager{public: // 유일한 인스턴스를 반환하는 정적 함수 static SoundManager& Get() { static SoundManager Instance; // 최초 호출 시 딱 한 번만 생성 return Insta..

디자인패턴 2026.05.08

그래픽스) 쿼터니언

3D에서 회전을 표현하는 방식은 여러가지가 있다. 오일러 각 : X,Y, Z 축 회전값 3개로 표현(Roll, Pitch, Yaw)회전 행렬 : 3X3 행렬로 표현쿼터니언 : 4개의 숫자로 표현 오일러 각이 가장 직관적이지만 짐벌락 문제가 존재 짐벌 : 3개의 링이 각각 X, Y, Z축으로 회전하는 구조 오일러 각은 X -> Y -> Z 순서로 순차적으로 회전을 적용여기서 중간 축 Y를 90도 회전시키면, Z축이랑 같은 평면에 겹쳐버림. 사실상 회전 개수가 2개로 줄어드는 셈이러한 현상을 짐벌락이하고 한다. 게임에서는 캐릭터가 고개를 90도 젖혔을 때 좌우 회전이 이상하게 되는 현상과 비슷 이러한 문제를 해결하기 위해 쿼터니언을 사용 q = w+xi + yj+ zk(w : 실수, 회전량)(x, y, z ..

그래픽스 2026.05.08

그래픽스) 월드, 뷰, 프로젝션 변환

1단계 월드 변환 오브젝트의 로컬 좌표 -> 월드 좌표고 변환 모든 오브젝트는 처음엔 자기 자신을 원점(0,0,0)으로 삼는 로컬 공간에 존재이걸 실제 게임 세계의 좌표계로 배치하는 과정 언리얼에서는 SetActorLocation, SetActorRotation 이 곧 월드 행렬 조작 2단계 뷰 변환월드 공간 전체를 카메라를 원점으로 삼는 좌표계로 변환카메라를 움직이는 게 아닌, 카메라가 원점,정면을 보는 것처럼 월드 전체를 반대로 이동/회전시키는 개념 카메라 위치, 방향, 위쪽 방향 세가지로 뷰 행렬이 구성 3단계 프로젝션 변환 뷰 공간의 3D 좌표 -> 클립 공간으로 변환 멀리 있는 건 작게, 가까이 있는 건 크게 보이는 것이 이 단계에서 결정 1. 원근 투영 : 멀리 있을 수록 작아 보임. 2. ..

그래픽스 2026.05.07

그래픽스) 인덱스 버퍼

3D 오브젝트를 화면에 그리려면 GPU에 버텍스 데이터를 넘겨야 한다.정육면체를 예로 들면, 면이 6개이고 각 면은 삼각형 2개로 구성된다. 삼각형 1개 = 버텍스 3개이므로 큐브 한개당 총 26개의 버텍스로 구성 하지만 실제 큐브의 꼭짓점은 8개뿐, 버텍스 버퍼만 쓰면 같은 꼭짓점을 중복해서 36번 저장해야하는 상황 이러한 중복 문제를 해결하기 위해 인덱스 버퍼를 사용 인덱스 버퍼 : 버텍스를 번호로 참조하는 별도의 배열 장점 1. 메모리 절약 버텍스 버퍼만인덱스 버퍼 사용큐브36개 버텍스8개 버텍스 + 36개 인덱스버텍스 1개 크기약 32바이트인덱스 1개 = 2 ~4바이트총 용량1,152 바이트256 + 144 = 400바이트 복잡한 메시일수록 절약효과 상승 2. 캐시 효율 향상 - GPU는 ..

그래픽스 2026.05.07