'Java' 카테고리의 다른 글
Java Thread (0) | 2019.07.11 |
---|---|
데코레이터 패턴과 자바 입출력 (0) | 2019.07.10 |
[펌] Java 유료 논쟁, Oracle JDK와 OpenJDK의 차이 정리 (0) | 2018.08.07 |
J2SE 8 documentation CHM Html Help file (0) | 2018.01.11 |
[github] OpenJDK 1.8 Windows (0) | 2018.01.09 |
Java Thread (0) | 2019.07.11 |
---|---|
데코레이터 패턴과 자바 입출력 (0) | 2019.07.10 |
[펌] Java 유료 논쟁, Oracle JDK와 OpenJDK의 차이 정리 (0) | 2018.08.07 |
J2SE 8 documentation CHM Html Help file (0) | 2018.01.11 |
[github] OpenJDK 1.8 Windows (0) | 2018.01.09 |
[읽기 전에...]
번역된 글에 경어와 비경어가 섞여 있을 수 있사오나 그것은 독자를 무시한 행동이 아니며 역자의 글쓰는 능력이 부족함을 한탄해야 할 것입니다. 허저분한 번역이 보기 싫으시면 바로 출처를 클릭하시기를 바랍니다. 역자의 글이 좋지않아 원문을 보지 않는 愚는 범하지 않도록 합시다
CStdString - 표준 C++ 을 사용한 CString-clone
출처 : https://www.codeproject.com/Articles/1146/CString-clone-Using-Standard-C
2001년 5월 29일 초안
2004년 8월 5일 갱신
2012년 2월 27일 갱신
필자 : Joe O'Leary
역자 : j2doll
'표준 C++ 라이브러리의 basic_string 템플릿에 기반한 CString 의 대체물'
소개
저(필자)는 표준 C++ 라이브러리를 애용해 오면서도, basic_string<> 템플릿 만큼은 좋아하질 않습니다. 때때로 디자이너들의 한물간 방식들이 사용하기 어렵게 만드는 것 같습니다.
반면, 필자는 MFC의 CString 클래스를 사용하기를 즐기는 편이었습니다. CString은 NULL 포인터를 체크해 주고, 암시적으로 const TCHAR* 로 변환시켜 주며, 문자열 프로그램을 사용하기에 손쉬운 멤버 함수들을 제공해 줍니다. ( Format(), Load() 등등 )
하지만 물론, 필자는 더 이상 MFC 를 사용하지는 않습니다. 사실, 플랫폼 이식을 위해서 어떠한 독점적인 라이브러리도 사용하기를 원하지 않기 때문입니다.
그래서 저는 양쪽 세계의 장점만을 모으기로 결심했습니다.
그것이 클래스(사실은 템플릿) basic_string<TCHAR> 에서 상속받은 클래스 CStdString 입니다.
그것은 basic_string 에 CString 전체 API 를 더한 것입니다. 거기에 CString 의 사용 용이성에 basic_string 의 호환성을 보장받게 될 것입니다.
간단히 말해서, CStdString 객체는 다음에 이야기할 몇몇 예외 사항을 제외하고는 basic_string 입니다. 그리고 CString 를 대체할 수도 있는 대체물이기도 합니다.
그것들은 basic_string 과 CString 의 양쪽 API 에서 가장 잘 알려지고 많이 문서화된 부분들입니다.
저는 이 글을 수 년 전, 다른 코드 싸이트에도 올렸었습니다.
하지만 필자가 CodeProject 를 좋아하기에 여기에도 또한 글을 올려봅니다. (이글의 원문은 codeproject에 있습니다.)
필자는 본 클래스를 지난 4년간 상업적인 프로젝트들에도 사용해 왔었습니다.
그 결과, 이 클래스는 필자가 그 동안 만들어 것 중에 가장 유용한 것으로 증명되었습니다.
하지만 물론 다방면으로 디버깅되어야 할 것입니다. 필자는 독자 분들도 그 점을 좋아하시기를 바랍니다. 어떤 문제 점이 있다면 이메일을 보내주시기를 바란다. (필자에게) 도움을 주시면 고맙겠습니다.
CString 함수들의 작동을 나타낸 간단한 어플리케이션 소스를 제공하였습니다. (하지만 정말 대용품입니다.)
예제 프로젝트의 목록들은 CString 과(또는) basic_string 템플릿을 사용합니다.
특징
그리고 이 코드에서 지적할 두 가지 주목할 점(CString 과의 호환성과 basic_string 에서의 상속)이 있습니다.
CString 호환성
필자는 완전하게 똑같이 CString API 와 같이 재구현할 수는 없었습니다.
그래서 (공유할 수 있지만 다르게 구현된) CString 와 basic_string 를 위한 두 가지 함수들로 되게 하였습니다.
이러한 경우에 CString 처럼 이라기보다는 basic_string 처럼 행동하는 CStdString 를 만드는 것이 최선이라고 느꼈습니다. (정확하게는…)
또한, CString 에서 구현하지 못한 두 개의 함수들이 있습니다. ( LockBuffer() 와 UnlockBuffer() )
basic_string<> 의로부터의 상속
필자가 작성한 basic_string 로부터 상속받은 템플릿은 가상 소멸자(virtual destructor)가 없는 클래스 템플릿입니다.
어떤 C++ 에 관한 소개글들에서는 가상 파괴자가 없는 클래스는 위험하다고 말한적이 있습니다.
때로는 정의되지 않은 것처럼 정의되지 않은 것처럼 해야 할 수도 있습니다.
다음같이 기반 클래스의 포인터를 통해 CStdStringA 를 삭제하는 것처럼 코딩할려면, 기술적으로 정의되지 않은 행동을 해야 합니다.
// 베이스 포인터에 상속 받은 객체를 할당 std::string* pstr = new CStdStringA( "Hi" ) ;
// 베이스 포인터를 통해 파생 삭제 à 정의되지 않음 delete pstr;
|
하지만 (개인적으로) 많이 주목할 점이라고 생각하지는 않습니다.
아마도 문제는 정말 얼마나 자주 문자열 객체를 이처럼 할 것인가 하는냐는 점입니다.
필자는 그 동안 거의 동적으로 문자열 객체를 힙에 할당하는 일은 없었던 것 같습니다.
그리고 베이스 클래스 포인터를 사용하지 않을 것입니다.
이같은 사용하지 않는다면 크게 걱정할 일은 없을 것입니다.
사실 이러한 방식으로 코딩한다면 CStdString 를 사용하는 것에 문제점이 있다고 의심해 볼 만합니다.
적어도 Microsoft Visual C++ 에서 이야기 하자면 에러와 메모리 누수가 없다고 이야기 할 수 있습니다.
아마 많은 다른 컴파일러들이 문제를 준다는 것에도 의심해 보야야 할 것입니다.
하지만 필자의 의심은 C++ 세계의 현실성에 이용하지는 않을 것입니다.
역돌이 外書
: MFC 를 사용하여도 다음같이 문자열을 관리하는 일은 드물 것입니다.
CString *pStr = new CString () ; |
(물론 C++ 를 모르시고 Java 만 아시다면 이게 뭐가 문제야 하시겠지만…--;)
역자도
CString strBuffer = _T( "Buffer" ) ; _tcscpy( szBuffer, strBuffer ); |
와 같은 방식보다는,
_tcscpy( szBuffer, strBuffer.GetBuffer(strBuffer.GetLength()) ); |
가 더 정상적인 관리라고 생각하며, 필자의 의견에 동의해 봅니다.
이 글은 Verdana 글꼴에 최적화되어 있습니다. 2004년 여름과 가을 사이, 짜증나는 날씨의 어느 날. By j2doll… KIN~
2011년 12월 7일에 source code가 update 되었습니다.
Orwell Dev-C++ 5.2.0.3 (0) | 2012.06.26 |
---|---|
Qt Polymorphism (0) | 2012.03.06 |
[ FUNNY CODE ][runtime error] 초기화 실패 (0) | 2011.10.06 |
[StudioStyles] 비주얼 스튜디오 색 변경 (Visual Studio Color Shceme) (0) | 2011.09.18 |
C 언어의 선대 언어 계승 기능 (0) | 2011.07.31 |
유클리드 호제법 (1) | 2008.11.28 |
---|---|
디피 헬만(Diffe-Hellman) 알고리즘 이해하기 (0) | 2007.09.14 |
과연 정렬 알고리즘을 몇 가지 이상 알아야 훌륭한 개발자인가? (2) | 2007.09.04 |
정팔각형과 계산... (2) | 2007.08.31 |
정팔각형 (0) | 2007.07.06 |