일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Docker
- Nebula
- JUCE라이브러리
- gui
- C++
- vim-go
- C++ gui
- go
- 백준
- 알고리즘
- c++ heap
- C++ gui 라이브러리
- LOB
- JUCE 튜토리얼
- C++ library
- 리듬게임
- JUCE library
- tour of go
- OS
- go channel
- BOJ
- 프로그래밍
- 자료구조
- JUCE
- 연결리스트
- 공룡책
- a tour of go
- C언어
- 코딩
- 운영체제
- Today
- Total
CafeM0ca
[디자인패턴] reverse OOP 본문
reverse OOP
- .h와 .cpp파일을 나눠쓰는 C++의 특성을 이용하여 상속관계에서 발생하는 virtual함수의 단점을 없앤다. 주로 게임엔진에서 씀.
위 영상을 보고 적당한 예시를 생각해보았다. 멀티플랫폼을 대상으로 작업해본게 없어서 적당한지는 모르겠지만 아무튼.
예를 들어 어떤 멀티플랫폼용 프로그램에서 간단하게 콘솔화면을 정리해주는 함수를 사용하게 되었다고 가정하자.
윈도우에서는 system("cls") 를 사용하고 리눅스에서는 system("clear") 를 사용한다.
환경에 맞춰서 제공해주기 위해 다음과 같이 상속했다.
일반적으로 자식 클래스들은 플랫폼 입맛에 맞게 consoleclean() 가상함수를 오버라이딩 할 것이다. (그러나 우리는 가상함수가 느리다는 사실을 잘 알고 있다.)
영상을 보기 전까지는 일반적으로 생각할 수 있는 상속구조다.
그럼 reverse OOP는 이것과 어떻게 다를까?
일단 platform.h에 consoleclean()이 virtual 키워드를 때고 선언한다.
그리고 이에 대한 정의는 각 파생 클래스의 .cpp파일에 다음과 같이 정의한다.
//window.cpp
void platform::consoleclean()
{
system("cls");
}//linux.cpp
void platform::consoleclean()
{
system("clear");
따라서 이 디바이스들(멤버 변수)을 분리해줘야 하는데 각 파생클래스의 .h에 정의한다.
ospaltform.h를 하나 만들고 운영체제에 알맞게 전처리기로 OS를 정의한다.
osplatform.h를 include 하고 platform클래스가 OS를 상속하면 linux 환경에서는 public linux, windows 환경에서는 public Windows를 상속하게 되는 형태가 된다.
각 기초클래스(window,linux)들이 멤버 변수들을 protected로 선언하면 platform은 접근 가능하다.
이런식으로 구축하면 가상테이블 같은게 필요없어진다. -> 성능상 이점 + 관리 편안(OOP 지킬껀 다 지키니까!)~
'Programming > 디자인패턴' 카테고리의 다른 글
[디자인패턴] Bridge 패턴 (0) | 2020.12.05 |
---|---|
[디자인패턴]싱글톤 (0) | 2018.01.22 |