요즘은 FA회사를 다니다보니 IO쪽 작업을 많이 하게 됩니다. 시리얼통신, 소켓통신, AD보드, 영상처리보드...
문제는 저희 회사 주력 개발툴은 VC++이고 전 VC++하고 친하지 않을 뿐만 아니라 친해지고 싶지도 않다는거죠.
주로 미국 본사에서 받아온 VC++ 소스를 조금씩 수정해서 적용하고 있는 회사입니다.(별로 맘에 드는 구조는 아닙니다.)
그럼에도 불구하고 저는 C++ Builder로 작업하고 있습니다. 대신 IO쪽 관련 코드는 VCL을 완전히 배제하고 표준 C++로만 만들고 있죠. 아... 이거 참 스트레스 받는 일입니다.
제가 그동안 만들어 놓은 자원들은 모두 VCL을 적극적으로 쓰고 있다보니... 거의 새로 만들어서 쓰고 있는 형편입니다.
다른건 그래도 그럭저럭 괜찮은데 제일 아쉬운건 역시 AnsiString을 못 쓴다는거네요. 그래서 STL의 string을 쓰기로 했죠. 그러나 STL도 DLL에서는 사용에 제약이 가해지는데다가 이상하게 Avantech사의 제품을 쓰기 위해 그쪽 라이브러리를 붙이면 STL하고 같이 쓸 경우 메모리 Access Violation이 자꾸 뜨네요. 똑같은 루틴에 MCC사의 라이브러리를 붙이면 아무 문제 없는데 말이죠. -_-;; 실제로 STL과 Advantech의 라이브러리가 충돌을 일으키고 있는건지는 알 수 없으나 현상은 아무튼 그렇습니다.
여차저차해서 여러가지 이유로 결국엔 String클래스를 새로 하나 만들었습니다. TSimpleString이라고... VCL의 AnsiString과 사용방법이 비슷한... 여차하면 이름만 AnsiString으로 바꿔도 되도록...
좀 특징적이라면 문자열 크기가 변경될 때 전통적인 방법인 new로 새로운 크기로 할당하고 데이터 복사하지 않고 HeapAlloc과 HeapReAlloc을 써서 데이터 복사를 하지 않도록 한 정도? 뭐.. 별거 없습니다.
그건 그렇고 AnsiString과 동일하게 동작하게 하는건 간단한 문제가 아니더군요. AnsiString은 일반적인 문자열 클래스와는 달리 문자열 데이터 관리를 proxy가 처리하게 되어 있습니다. COM하고 비슷하게 문자열 데이터에 ref count를 매겨서 관리하죠. 데이터 관리는 복잡하지만 효율측면에선 엄청 좋을 수 밖에 없습니다. 문자열을 반환하는 함수의 경우 STL의 경우 문자열 복사가 이루어지지만 AnsiString은 그냥 레퍼런스만 넘어갑니다. 이게 가능한게 proxy가 ref count를 관리하게 때문이죠. MFC의 CString은 어떤 구조인지 모르겠네요. 좀 궁금합니다.
뭐... 이런것 까지 다 되게 하고싶은 마음은 굴뚝같았지만 일단 참았습니다.
끝이 없을 것 같더군요. 주 목적은 문자열 저장이지 문자열 연산이 아니었거든요. 게다가 AnsiString은 TDateTime과도 연관되어 있기 때문에 '이쯤에서 일단 중단하자. 이정도면 지금은 충분해!' 했죠. 말 나온 김에 TDateTime도 제 생각엔 정말 고민 많이해서 만든 클래스 같습니다. double로 관리되는 날짜 & 시간 정보... 날짜부와 시간부가 자연스럽게 분리되고 따라서 날짜 연산이 자연스럽죠. Win32의 SYSTEMTIME이나 FILETIME, time.h의 time_t는 모두 2% 부족하다고나 할까...
SYSTEMTIME은 년,월,일,시,분,초,밀리초가 모두 분리되어 저장돼서 표시하는건 쉽지만 용량 많이 잡아먹고, 날짜끼리 연산하려면 FILETIME으로 변환해서 그걸다시 LONGLONG타입으로 변환해서 계산하고 다시 역변환 해야하고...
FILETIME은 시간 해상도는 우수하지만 역시 LONGLONG으로 변환하거나 SYSTEMTIME으로 변환해야 하고...
time_t는 용량도 4byte로 적게 먹고 쓰기도 편리한 편이지만 결정적으로 시간 해상도가 초단위죠.
그에 비하면 TDateTime은 용량면에서도 8byte로 FILETIME과 동일, 취급하기도 쉽고 날짜 시간부 분리도 간단하고 계산도 변환 필요없이 double타입으로 취급해서 계산하면 되고... 대신 Now()같은 함수로 현재 시간을 얻어올 때는 내부적으로는 SYSTEMTIME을 얻어서 이를 double로 변환할테니 이때는 효율에선 좀 뒤쳐지겠지만 다른 장점이 훨씬 많은 듯 합니다.
쓰다보니 TDateTime Clone을 하나 만들면 좋지 않을까 하는 생각이 드네요. TDateTime과 호환되면서 기능이 좀 더 확장되어 음력, 단기까지 지원하는 새로운 DateTime클래스와 이와 연계된 AnsiString클론 클래스... 이름하야 TDateTimeEx!!!
예를 들면
TDateTime dtNow = Now();
ShowMessage(dtNow.FormatString("yyyymmdd hhnnss"));
이게 양력이라면
TDateTimeEx dtxNow = Now();
ShowMessage(dtxNow.FormatString("KLLLLMMDD hhnnss")); //K는 윤달표시, 대문자는 음력
이런식으로... 음력을 위한 기능이 추가되는거죠. '갑자', '甲子' 이런거 다 지원하고 단기 지원 등을 위한 새로운 Format문자 추가..
여튼... 회사에선 공통으로 쓸 기반 클래스 제작을 자임하면서 C++ Builder 사용을 허가 받았고 앞으로 기존 소스의 문제를 일으키고 있다는 MFC에 의존한 부분을 우선적으로, 최종적으로는 제가 새로 만드는 클래스들로 전부 대치해 나갈 생각입니다. 결국 기존 VC++ 소스엔 껍데기만 남겠죠. 그럼 뭐 C++ Builder로 다 해 버릴 수 있겠죠. ^^
대신 몸은 좀 피곤해지고 있습니다. 자꾸 이것 저것 해결해달라는 요청이 늘어나서리...
아.. 시화에서의 불쌍한 내 인생... 서울 강남 생활 돌리도~~~ 임프님은 좋겠당... 서울에서!!, 게다가 강남에서!!!!, 게다가 듀오에서!!!!!!!!! 이쁜언니(정보)들에 둘러싸여서...
아.. 근데 내가 무슨 얘기 하려고 이 글을 쓰기 시작했더라.. 이상한 결론이네... -_-
그냥 주절주절이 되어버렸네요.
|
저도 하루 빨리 적금 붓는 생활을...
마음껏 지름신을 섬길 수 있는 생활을...
하고파요~~~
지름 천국
절약 지옥 (-o-)/