흔히 객체지향 프로그래밍이라 함은 쉽게 생각해 본다면 모든 것을 객체로 만드는 것이라고 할 수 있겠다. 그러나 C++은 태생적으로 main이 일반 함수이기 때문에 모든 것을 객체로 만들 수가 없다.
GUI, 스마트폰 앱, 게임과 같이 특정 분야의 애플리케이션들은 전체적인 흐름이 항상 유사하다. 이런 전체적인 흐름이 유사한 애플리케이션에서는 이를 위해 main함수 안에서 전반적인 흐름을 담아 라이브러리 내부에 감추는 기법을 사용한다.
#include <iostream>
using namespace std;
class CWinApp; // 클래스 전방선언
CWinApp* g_app = 0;
class CWinApp
{
public:
CWinApp() { g_app = this; }
virtual bool InitInstance() {return false;}
virtual int ExitInstance() {return false;}
virtual int Run() {return 0;}
};
int main()
{
if( g_app->InitInstance() == true)
{
g_app->Run();
}
g_app->ExitInstance();
return 0;
}
g_app 객체를 통해 main함수 내에서 초기화 -> 실행 -> 종료의 흐름이 만들어졌다. 사용자는 다음과 같이 CWinApp을 상속 받아서 이 흐름을 재정의 하여 사용할 수 있겠고, 상속 된 클래스를 전역 객체로 만들어야 한다.
class MyApp : public CWinApp
{
public:
virtual bool InitInstance()
{
cout << "InitInstance" << endl;
return true;
}
virtual int ExitInstance()
{
cout << "Finish" << endl;
return 0;
}
};
MyApp myApp;
기본적인 프로그램이 실행되는 순서는 다음과 같다.
(1) 전역변수가 있을 때, 전역 변수의 생성자 실행
(2) 기반 클래스 생성자 실행
(3) main이 실행된다. 이다.
myApp이 전역변수 이므로 myApp의 주소는 CWinApp의 생성자에 의해 g_app에 먼저 저장된다. 그 다음 main이 실행된다. 이러한 이유로 파생클래스의 인스턴스가 전역으로 사용되어야 한다.
그리고 사용자는 애플리케이션의 시작 단계에서 해야할 일을 MyApp::InitInstance()에서 구현할 수 있고, 종료단계에서 해야할 일을 MyApp::ExitInstance()에서 구현할 수 있다.
이렇게 애플리케이션의 전체적인 흐름을 라이브러리가 갖고 있는 것을 보통 "애플리케이션 프레임워크"라고 한다. 이러한 형태는 흔히 MFC, QT, WxWidget, iOS, Android 등에서 볼 수 있다.
'프로그래밍 이야기 > C++ 기초' 카테고리의 다른 글
[C++]Design Pattern - Decorator Pattern (0) | 2020.12.18 |
---|---|
[C++] 일반 함수에서의 가변성 (0) | 2020.12.11 |
[C++] Design Pattern - Policy Base Design (0) | 2020.12.05 |
[C++]Design Pattern - 변하는 것을 분리하기 (0) | 2020.12.01 |
[C++]Design Pattern - 변하는 것을 분리하기 (0) | 2020.12.01 |