일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 파일시스템 구현
- 멀티쓰레드
- directx
- 병행성
- 렌더링 파이프라인
- 동적계획법
- 운영체제
- 그리디 알고리즘
- 다이나믹 프로그래밍
- 컨디션 변수
- 자료구조
- 그리디알고리즘
- 프로그래머스
- 영속성
- 멀티프로세서
- 병행성 관련 오류
- 디자인패턴
- 백준
- I/O장치
- 타입 객체
- 스케줄링
- 쓰레드
- OS
- DirectX12
- Direct12
- 락
- codility
- DirectX 12
- 다이나믹프로그래밍
- 알고리즘
- Today
- Total
목록디자인패턴 (8)
기록공간

클래스 하나를 인스턴스 별로 다른 객체형으로 표현할 수 있게 만드어, 새로운 '클래스들'을 유연하게 만들 수 있게 한다. 의도 개발 중인 판타지 RPG에서, 포악한 몬스터 무리를 구현해야 한다고 해보자. 몬스터는 체력, 공격력, 그래픽 리소스, 사운드 등 다양한 속성이 있지만 여기서는 체력과 공격 속성만을 고려한다. 모든 몬스터에는 체력 값이 있다. 체력은 최대 체력에서 시작해 피해를 입을 때마다 조금씩 줄어든다. 몬스터에게는 공격 문구(attack string) 속성도 있다. 몬스터가 영웅을 공격할 때, 이 공격 문구는 유저에게 표시된다. 기획자는 '용'이나 '트롤'같이 몬스터 종족(breed)을 다양하게 만들고 싶어 한다. 각 종족은 몬스터의 특징을 나타내고, 던전에는 같은 종족 몬스터가 여러 마리 ..

개발에서 게임분야는 재미있을지는 몰라도, 절대 쉽지 않다. 요즘 게임을 만들기 위해서는 엄청난 양의 소스 코드를 구현해야 한다. 심지어 유통사에서 품질을 엄격히 심사하기 때문에 버그나 크래시가 나는 경우 출시가 불가능해진다. 또한 플랫폼의 성능도 최대한 뽑아내야 한다. 게임은 다른 소프트웨어보다 성능이 중요하다. 성능이 나오도록 하기 위해서는 불가피하게 최적화 작업이 필요하다. 게임 개발은 성능과 안전을 위해 C++과 같은 중량 언어(Heavyweight language)를 사용한다. 이런 언어는 하드웨어 성능을 최대한 끌어낼 수 있는 저 수준 표현과 버그를 막거나 회피하기 위한 시스템을 함께 제공한다. 게임 개발자 되기 위한 비용은 만만치 않다. 몇 년간 집중 훈련이 필요하고, 그런 후에도 엄청난 규모..

"객체의 내부 상태에 따라 스스로 행동을 변경할 수 있게 허가하는 패턴으로, 이렇게 하면 객체는 마치 자신의 클래스를 바꾸는 것처럼 보입니다. (GoF의 디자인패턴, p395)" 이번 장에서는 상태 패턴을 다루지만 좀 더 근본 개념인 유한 상태 기계(Finite State Machine : FSM)도 언급한다. 그러다 보니 계층형 상태 기계(Hierarchical State Machine)와 푸시다운 오토마타(Pushdown Automata)도 언급한다. 상태 기계는 AI나 컴파일러 개발자라면 익숙한 개념인 만큼 이러한 분야들에 자주 쓰이고 있다. 상태 기계는 알아두면 좋기 때문에, 다른 분야에서는 어떻게 활용 가능한지 살펴보도록 하겠다. 추억의 게임 만들기 간단한 플랫포머(슈퍼마리오 같은 게임)를 만든..
"오직 한 개의 클래스 인스턴스만을 갖도록 보장하고, 이에 대한 전역적인 접근점을 제공합니다." (GoF의 디자인 패턴 181p) 이번 장은 어떻게 하면 패턴을 안 쓸 수 있는지를 보여준다는 점에서 다른 장과는 정반대다. 싱글턴 패턴은 의도와는 달리 득보다는 실이 많다. GoF도 싱글턴 패턴을 남용하지 말라고 강조한다. 워낙 남용되는 패턴이다 보니 이 장에서는 싱글턴을 피할 방법을 주로 다루겠지만, 그래도 우선은 싱글턴 패턴에 대해서 살펴보자. 싱글턴 패턴 GoF의 디자인 패턴에서 발췌한 싱글턴 요약을 쉼표 기준으로 나눠 각각 살펴보자. 오직 한 개의 클래스 인스턴스만 갖도록 보장 인스턴스가 여러 개면 제대로 작동하지 않는 상황이 종종 있다. 외부 시스템과 상호작용하면서 전역 상태를 관리하는 클래스 같은..

"원형이 되는(Prototypical) 인스턴스를 사용하여 생성할 객체의 종류를 명시하고, 이렇게 만든 견본을 복사해서 새로운 객체를 생성합니다." (GoF의 디자인 패턴 169p) 이번 장에서는 프로토타입에 대해서 다루기도 하지만, '프로토타입' 용어와 개념이 어떻게 유래되었는지도 함께 다룬다. 우선 패턴부터 살펴보도록 하자. 프로토타입 디자인 패턴 몬스터에도 종류가 존재한다. 한 개체에서도 여러 종류로 몬스터가 나뉠 수 있다. 게임에 나오는 몬스터마다 Ghost, Demon, Sorcerer 같은 클래스를 만들어보자. class Monster { // 기타 등등.. }; class Ghost : public Monster {}; class Demon : public Monster {}; class S..

"객체 사이에 일 대 다의 의존 관계를 정의해두어, 어떤 객체의 상태가 변할 때 그 객체의 의존성을 가진 다른 객체들이 그 변화를 통지 받고 자동으로 업데이트될 수 있습니다." (GoF 디자인패턴 382p) 관찰자 패턴은 가장 널리 사용되고 있고 흔하게 볼 수 있다. 그래서 자바에서는 핵심 라이브러리(java.util.Observer)에 들어가 있고, C#에서는 event 키워드로 지원한다. 게임 개발 입장에서 관찰자 패턴을 어떻게 써먹을 수 있을지 우선 예를 한번 들어보자. 업적 달성 업적 시스템은 요즘 중요하기도 할 뿐더러 최근에 많은 게임에서 쓰이고 있다. 업적 시스템을 추가한다고 해보자. 게임에서 업적은 종류가 정말 광범위하고 달성 방법도 다양하기 때문에 깔끔하게 구현하기가 정말 어렵다. 조금만 ..

"공유(Sharing)를 통해 많은 수의 소립(Fine-Grained) 객체들을 효과적으로 지원합니다." (GoF의 디자인 패턴 311p) 숲에 들어갈 나무들 우선 경량 패턴이 어떠한 상황에 쓰이는지부터 알아보도록 한다. 일반적으로 나무가 울창하게 있는 숲을 구현할 때에는 '경량' 패턴으로 종종 구현하게 된다. 구비구비 뻗어 있는 숲을 글로는 몇 문장으로 표현이 가능하지만, 실시간 게임으로 구현하는 것은 전혀 다른 이야기이다. 숲이다 보니 수천 그루가 넘는 나무마다 각각 수천 폴리곤의 형태로 표현해야 한다. 설사 메모리가 충분하다고 해도, 이런 숲을 그리기 위해서는 전체 데이터를 CPU에서 GPU로 전달해야 한다. 나무마다 필요한 데이터를 코드로 표현하면 다음과 같다. class Tree { privat..

"요청 자체를 캡슐화 하는 것입니다. 이를 통해 서로 다른 사용자(client)를 매개변수로 만들고, 요청을 대기시키거나 로깅하며, 되돌릴 수 있는 연산을 지원합니다." (GoF의 디자인 패턴 311p) 명령패턴을 매우 간결하게 요약하면 다음과 같다. 명령 패턴은 메서드 호출을 실체화(reify) 한 것이다. 실체화는 '실제하는 것으로 만든다'라는 뜻으로, 프로그래밍 분야에서는 무엇인가를 '일급(first-class)'으로 만든다는 뜻으로 통한다. 즉, 어떤 개념을 변수에 저장하거나 함수에 전달할 수 있도록 데이터, 즉 객체로 바꿀 수 있다는 것을 의미한다. 여기에서 명령 패턴을 '메서드 호출을 실체화한 것'이라고 한 것은 함수 호출을 객체로 감쌌다는 의미이다. GoF에서는 '명령 패턴은 콜백을 객체지향..