Day20 - 생성, 구조, 행동 패턴, 알고리즘

Kyu_·2025년 12월 24일

Unreal 본캠프

목록 보기
21/35

C++ 복습 세션 점프업

생성패턴 : 싱글톤

  • 게임매니저나 오디오 매니저 처럼 세상에 단 하나만 존재해야 하는 관리자 녀석들이 필요할때 쓴다.

Q4. static 멤버 변수를 사용하는 이유는?

  • 객체 생성 없이도 접근 가능하고, 모든 객체가 공유하기 위해

Q5. 싱글톤의 단점으로 지적되는 것은?

  • 전역 상태를 만들기 때문에 결합도(Coupling)가 높아질 수 있다.

코드 Q5. GameManager::instance를 클래스 밖에서 nullptr로 초기화해주지 않으면 어떻게 되는가?

  • static변수는 Class밖에서 초기화해주어야한다. 클래스 내부에서 초기화하면 클래스가 생성될때마다 초기화 될 위험이 있어서 컴파일 에러를 뱉는다.

구조 패턴 : 데코레이터

  • 게임에서의 무기 속성부여 강화시스템 느낌??

Q2. 상속 대신 데코레이터를 쓰는 이유는?

  • 기능을 정적으로 고정하지 않고, 실행 중에 동적으로 유연하게 추가/제거하기 위해

Q3. 데코레이터 클래스는 왜 Weapon을 상속받으면서 동시에 Weapon멤버 변수를 가질까?

  • 자기도 Weapon처럼 취급되면서(상속), 실제 행동은 감싸고 있는 Weapon에게 위임하기 위해

Q5. 데코레이터 패턴의 단점

  • 작은 객체들이 너무 많이 생겨서 디버깅이 조금 복잡해질 수 있다.

행동 패턴 : 옵저버

  • 구독과 좋아요!
  • 주체(Subject)의 상태가 변하면 이를 구독(Observe)하고 있던 관찰자들에게 자동으로 알려주는 패턴
  • 게임 UI(체력바 갱신)나 업적 달성에 필수적

Q1. 옵저버 패턴은 주로 어떤 관계를 해결하기 위해 사용하는가?

  • 1대다(1:N)의 의존관계에서 데이터 변경 시 자동 갱신

Q3. 옵저버 패턴의 장점은

  • Subject와 Observer가 서로 깊게 알필요가 없다(느슨한 결합)

코드 카타

최소 공배수, 최대 공약수

int gcd(int a, int b){
    while (b!=0){
        int tmp = b;
        b = a % b;
        a = tmp;
    }
    return a;
}

long long lcm(int a, int b){
    return (long long)a*b / gcd(a, b);
}
  • 자주까먹는 놈
  • C++17부터는 numeric헤더를 통해 만들 수 있다고 한다.
#include <numeric>

int gcd_result = std::gcd(a, b);
int lcm_result = std::lcm(a, b);
  • 편리하다!

범위

별거는 아닌데 int형이 넘을거같으면 long long을 사용하도록 하자 int의 범위 넘는거 계산안하고 계속 쓰다가 오류난적이 많음

백준

오후에 컨디션이 쏘배드라서 알고리즘 풀었다.
예전에 풀던것들을 C++로 풀어보니까 C++에 좀 익숙해지기도 한거같고, 확실히 속도가 빨라서 좋다.
string, vector, queue, map, set 등등 메서드 자주까먹는데 날잡고 한번 외워야 될듯

총 정리

  • 디자인패턴 3종 : 싱글톤, 데코레이터, 옵저버
  • GCD/LCM : numeric
  • 범위 주의
  • STL 익히기

0개의 댓글