[_jcode mini-project] JString Design(1) (작성중)

서론

우리가 아무런 생각 없이 단순히 document만 보고도 작성할 수 있는 것들이 있습니다. STL도 그 중 하나이고 더 큼직한 것들인 OpenCV, MFC, Qt for C++ 등등. 우리가 쓰는 흔히 말하는 어떠한 결과물을 얻기 위해서는 단순히 라이브러리/프레임워크가 지원하는 여러 객체 정도만 알고 있어도 무방합니다. 예를 들어 이 클래스가 어떤 놈이고 어떤 짓을 하고, 클래스가 어떠한 놈인지는 모른 채 객체를 생성했을 때 그 인스턴스가 지원하는 method만 알면 됩니다. 알게 모르게 우리는 객체지향 프로그래밍 특성 중 하나인 객체화를 사용했던 겁니다. 이는 Java, Python, 자바스크립트 등등 여러 언어가 지원해 주고 있습니다.

System.out.println("Hello world!!");
// out 객체로 println 짓을 하라!! 원리는 아몰랑.
document.write("Hello world!!");
// document 객체로 write 짓을 하라!! 원리는 아몰랑.
std::cout << "Hello world!!"; 
// cout 객체로 operator <<() 짓을 하라!! 원리는 아몰랑.

크기를 조금 더 키워보면, 우리는

void CMFCApplication7App::OnAppAbout() 
{
	CAboutDlg aboutDlg;
	aboutDlg.DoModal();
}

“아하, CAboutDlg 클래스가 하나 선언이 되어있군. CDialog 상자 클래스를 상속받았으니 대화상자 하나를 나타내는 인스턴스네. Document를 보니 CDialog 클래스는 창을 띄우려면 DoModal() 함수를 불러와야 하는군.” “갖다 쓰자.”

이런 식으로 사용할 겁니다.

그런데 역으로 하나의 객체를 디자인해야 하는 입장이라면 상황이 달라집니다. 고려해야 할 변수가 너무 많기 때문입니다. 남들이 만들어 놓은 vector 객체나 string 객체는 그냥 편하게 안에 어떠한 부품이 들어가 있는지도 모른 채 갖다 쓰기만 하면 되었는데 밑바닥부터 무언가를 짜는 것은 쉽지 않습니다. 객체 하나에 대한 동작이 그 인스턴스에 대해 어떠한 영향을 끼칠지 모르기 때문입니다. 즉, 고려해야 하는 것들이 너무나 많습니다.

그나마 자바나 자바스크립트, 파이썬은 조금 쉽습니다. 언어적으로 지원하는 기능이 C++에 비해 눈에 띄게 적습니다. 그런데 어딜 가나 강조하지만 C++은 모든 것을 타입화 합니다. 즉, struct로 단순히 변수들만 묶건, enum으로 묶건, class화 하여 하나의 특성과 동작을 정의하건 C++입장에서는 모두 타입입니다. (1) 하나의 타입을 선언하고, (2) 그 타입안에 묶인 데이터를 이용하여 작동시킵니다. C++은 이 짓을 완벽하게 하기 위하여 개발자의 자유도를 극한으로 높이고 책임 소재도 개발자의 몫으로 둡니다.

언젠가는 내가 나만의 클래스를 디자인하고, 그런 것들이 모여 하나의 큰 틀을 만들게 될 날이 올 수 있습니다. 수 많은 라이브러리를 갖다 쓰기만 하는게 아닌, 이번에는 내가 디자인하고 운이 좋으면 사용 license를 제 값을 받고 팔 수도 있습니다.

그렇다면 이번에는 가장 만만한 주제인 문자열 클래스를 디자인하는 연습을 해 봅시다. 처음부터 끝까지, 왠만하면 C++가 언어적으로 추구하는 기능을 포함하는 것을 이번 목표로 잡겠습니다. 자질구레한 문법 연습은 여기서 피하도록 합시다.

“I will call it, a JString.”

들어가기에 앞서

저는 아래와 같이 작성할겁니다. 보통 저의 경우는 쉬운 디버깅을 위해 main() 함수는 아래와 같이 틀을 잡아둡니다. 이 프로젝트에서는 컴파일 모드는 _UNIT_TEST_MODE_만 이용하겠습니다.

(이미지)

구조는 별 것 없습니다. 10~12번 줄에 defined 되어 있는 모드로 컴파일 하며 _UNIT_TEST_MODE_ 블록은 노란색으로 표시된 부분입니다. 그 밑의 빨간색 상자 부분은 단위 테스트 번호에 따라 컴파일하는 부분입니다. 코드가 그리 복잡한게 아니기 때문에 코드 수정하고 F5 연타해도 컴파일 시간이 오래 걸리지 않을 겁니다.

간혹 PRINT_XXXX() 매크로가 등장할 겁니다. ConsoleOut.h 헤더에 정의되어 있는 내용이며 이 또한 내용은 별 것 없습니다.

(이미지)

컴파일 하면 나타나는 cmd 창이 밋밋하여 글자 색을 바꿔줍니다. SetConsoleTextAttribute() 함수를 이용하며 색 코드는 위와 같이 이름 붙여 두었습니다. 아래와 같이 부르면 됩니다. 예를 들어,

(이미지)

static 으로 선언되었으니 아무렇게나 불러다 쓰면 됩니다. 그런데 이름이 너무 기네요. 그러니,

와 같이 정의하고 쓸 겁니다. 이게 편합니다 전, 아몰랑.

필자는 공군 작전정보통신단 체계개발실에서 복무(‘17~’19)하였습니다. 이 포스트는 작전정보통신단 병사 프로그래밍 동아리(LINK) 에서의 활동을 바탕으로 작성한 내용입니다.

다음 포스트: JString Design[2]

태그:

카테고리:

업데이트: