챕터1은 SW개발의 기본적인 부분을 설명하고 있다. 내용이 간단하므로, 포스트 하나로 정리할 수 있겠다.



1-1 모듈화

 SW 개발에 있어 모듈화는 어떤 도메인에서도 중요하고 기본적으로 지향해야 하는 개발 방식이라고 할 수 있다.



1-2 함수 포인터(Delegate)

 본 교재는 특이하게도 함수 포인터를 delegate로 정의 하였는데, 왜 그런가 찾아 보았더니, C#에서 함수 포인터를 그 이름 그대로 안부르고 delegate라고 명명했다는 것을 알았다. 아무래도 C#은 JAVA처럼 full-OOP 및 pointer-less를 지향하기 때문에 단독함수와 포인터 같은 개념을 그대로 쓰기 껄끄러웠나보다. 나는 C++ 개발자이므로, 그냥 함수 포인터라 부르겠다.



1-3 윈도우즈(Windows) 형의 사용

 우리나라의 게임 서버는 대부분 윈도서버에서 서비스되고 있는 것으로 알고 있다. 그러므로, 사실 크로스 플랫폼을 지향할 필요는 없을 것 같기 때문에 윈도형을 그대로 이용해도 무방할 것 같기는 하다. 수많은 Win32 API들을 혼동 없이 이용하려면 필수적이라는 생각도 든다.


 하지만, 개인적인 개발 경험에 비춰 보면 크로스플랫폼을 염두에 두고 개발하는 것이 좀 더 추상화를 고민하게 하여 유지보수성을 높이는데 도움이 되었던 것 같다. 때문에 ISO 표준인 stdint.h, inttypes.h 를 적극 활용하는 것도 한 번 생각해볼 수 있겠다.


 한가지 더, 본 교재는 TCHAR를 적극 활용하고 있는데, 교재의 집필(2006) 당시에는 지금처럼 유니코드에 대한 니즈가 확실하지 않았기 때문에 그러지 않았을까 한다. TCHAR로 구현을 하게 되면 컴파일 타임에 unicode 사용여부를 결정하게 되기 때문에 내가 2017~18년 동안 진행한 프로젝트를 보면 unicode 형을 기본으로 사용하고(wchar_t) ASCII나 UTF-8 등이 필요한 경우에는 char 형을 function overloading을 통해 동시에 지원하도록 했는데, 아무래도 시간이 많이 흐르다보니 점점 unicode가 기본 char형이 되어 가고 있는 것 같다.



1-4 클래스와 상속

 상속, 다형성, 캡슐화, 추상화, 가상함수 등등... C++ 개발자라면 응당 알고 있어야 하는 부분



1-5 템플릿(Template)

 사실 예전에는 코드 가독성 때문에 template을 현업에서 활용하는 게 참 애매했다. 그런데 내가 최근 사용한 오픈소스들은 너무도 당연하게 template을 아~~~~~~주 많이 활용하고 있더라. 더군다나 C++0x 표준의 variadic template을 API의 파라미터에 일말의 고민없이 쫙 깔아 놓은 것을 보고 많은 생각이 들었다. 요즘 유행하는 header-only 라이브러리들 역시 template이 꼭 필요한 것 같다. 신규 프로젝트를 진행하게 되면 template의 적극 활용을 검토해야 할 것 같다.



1-6 연산자 오버로딩(Operator Overloading)

 C++ 개발자가 연산자 오버로딩을 모를 수는 없고... 본 교재는 그 설명을 하기 보다는 스마트 포인터의 예시를 설명하기 위해 기술한 것 같다.

 여기서 설명하는 스마트 포인터는 std::auto_ptr 의 일부를 직접 구현한 내용인데, 요 기능은 C++11에야 표준으로 정리 된 것이라 필자께서 선각자로서의 모범을 보이신 것 같다.



1-7 서버 프로그램의 생각 방식

 본 섹션의 제목과는 다르게 어떤 도메인의 SW개발이라도 꼭 지켜야 하거나 고민해야 하는 내용이 담겨 있다. 이 중에서 new/delete에 대해서는 다시 한번 환기가 되었다. 역시 어떤 도메인에서도 성능을 위해 메모리 할당/해제를 최소화하는 것이 중요하다는 걸 알게되어 반가웠다.

 그런데, 요새는 윈도 서버에서 라이트한 new/delete를 OS 차원에서 제공해준다고 한다. 예를 들어 예전에는 Memory Pool 라이브러리를 이용하였는데, 이제는 영역을 지정해 놓으면 new/delete가 해당 영역 내에서 일어날 때 system call 이용에 대한 오버헤드를 아예 없애서 Memory Pool을 이용하는 것과 동일한 효과를 볼 수 있다고 하는데 좀 더 조사를 해보아야 겠다.



1-8 스레드(Thread)

 서버 프로그래밍에서 스레드는 필수겠지...



1-9 파이버(Fiber)

 윈도 프로그래밍을 오랫동안 했다고 생각했는데, 2019년 현재 처음 봤다... 참 어설픈 개발자라는 생각이 들고 반성 중이다... 본 교재에는 자세한 설명이 없으므로, 따로 공부를 해야 할 것 같다.


1-10 Critical Section(임계 구역)

 본 교재에서는 CS를 직접 이용하고 있는데, 내 경우에는 pthread_mutex나 std::mutex(C++11)를 이용하고 있다. 내부적으로 CS를 이용하기 때문에 성능의 이슈는 없다. 다만, 교재에서 언급한 뮤텍스는 MS의 뮤텍스 오브젝트로 메커니즘이 많이 다른 녀석이다.



Posted by JMAN