[Windows Programing]char, wchar_t, TCHAR, CString 클래스
char, wchar_t, TCHAR, CString 클래스는 모든 문자(열)을 다루는 타입이다.
하지만 이들 사이에 어떤 식의 연관 관계가 있는지 궁금했다. 특히나 char, wchar_t, TCHAR의 관계와 이 3가지 타입을 CString에 대입하는 방법이였다.
자~~~! Let`s Go~~~~~
====================================================================================
음. 우선 VS2008의 환경부터 알아봐야겠다. (아마 이전 버전도 지원되는 부분이 있을것이다. 이전 버전들을 사용할 때는 정확한 개념 없이 그냥 무작정 사용했던 관계로 정확한 건 아니다. : |)
VS2008에서는 유니코드와 멀티바이트 문자 집합을 지원한다. 이 문자 집합들은 ANSI가 영어만을 지원하기 때문에 다국어를 지원하기 위해서 나온 코드들이다.
유니코드 : 문자 하나당 2바이트의 공간을 확보
멀티바이트 : ANSI에서는 1바이트의 공간을 다국어에서는 2바이트의 공간을 확보(조금 예매한거 같아서 예를 들면 영어는 1바이트, 한글은 2바이트를 확보한다는 것이다.)
유니코드와 멀티바이트의 영향력은 TCHAR을 이야기할 때 나오므로 알고만 넘어가자.
자 그럼 char, wchar_t, TCHAR, CString을 파헤쳐보자. (자세하게까지는 아니지만.. :D )
char은 c언에서 사용되는 문자를 담는 타입으로 이 타입의 경우 1바이트의 공간을 확보한다.
wchar_t는 유니코드를 지원하기 위해서 사용되는 타입으로 2바이트의 저장공간을 확보한다. wchar_t 타입을 사용할 때는 문자(열)을 대입할 때 문자(열) 앞에 'L'을 붙여야 한다. 이 타입의 장점은 윈도우의 내부 함수들은 모든 유니코드를 사용하기 때문에 루틴이 짧아진다.(아실지 모르겠지만 윈도우에서 API를 이용할 때 인자로 ANSI코드일 경우 유니코드로 바꾸는 루틴이 존재한다.)
그리고 멋있는 TCHAR(내 생각에 얘는 타입이 아니라고 생각한다.)에 대하여 알아보자. TCHAR은 변형이 가능한 타입이다. 여기서 위에 설명한 문자집합이 적용되는데 간단하게 말하자면 유니코드일 때는 "TCHAR => wchar_t"이고, 멀티바이트라면 "TCHAR => char"이다. 문자 집합에 따라 바뀌기 때문에, 그리고 새로운 타입이 아니라 기존의 타입이므로 난 TCHAR을 메크로라고 생각하고 있다.
음. 위에 설명한 3가지 타입이 존재하지만 문자 집합의 영향을 생각하지 않고 싶다면 TCHAR을 사용하기 바란다. 왜 TCHA을 사용해야하는지 아래 예제를 보자.(너무 편협한 예제 일려나..)
이제 CString과의 관계를 생각해보자. 이걸 테스트하고 공부하게 된 계기가 char, wchar_t, TCHAR을 CString에 대입할 때 헷깔리는 부분이 생겨셔 였다. (CString에 관한 좋은 문서를 구글에서 찾아서 첨부 파일로 올렸다. 이 문서를 100프로 이해한다면 CString에 많이 접근할 수 있을 것이다.)
CString A;
char(wchar_t, TCHAR) *B = "XXXXXXXXXXXX";
A=B;
위의 코드는 참일까? 참이다. CString에 대한 내부 구조는 첨부파일을 확인하도록 하고, 여기서 주목할 부분은 타입에 상태에서 대입하면 정상적으로 작동한다는 것이다. 참 좋다.
근데 문제는 CString.Format() 멤버함수를 사용할 때 문제가 발생한다.
1. 문자 집합이 유니코드라면 char타입을 사용할 때 문제가 생긴다.
아래 그림 예제를 봐보자.!
그림을 보면 "Test HaHa"라는 문자열을 대입하면 출력했지만 결과는..
알수 없는 한자들이 나왔다. 왜그럴까?? 이유는 유니코드가 한 문자를 나타낼 때 2바이트의 공간을 사용하기 때문이다. 즉, 이 예제에서 한 글자를 표현할 때 'T'라는 문자가 아닌 "Te"라는 2개의 문자가 사용된 것이다.
2. 문자 집합이 멀티바이트라면 wchar_t타입을 사용할 때 문제가 생긴다.
멀티바이트에서는 무슨 문제가 생길까?
음? 이번에는 "TEst wchar_t"라는 문자열이 출력되야 할텐데 딸랑 'T'만 출력이 된다. 무슨 이유일까??
이유는 wchar_t의 확보공간과 사용공간의 차이때문이다. wchar은 2바이트의 공간을 사용하는데 'T'같은 ANSI 문자일 경우 1바이트만으로 표현이 가능하다. 그래서 나머지 한바이트는 0으로 채워지는데 이걸 멀티바이트에서는 널문자로 인식을 하게 되는 거이다.
그래서 char과 wchar_t를 사용하기 위해서는 언제나 고심할 필요가 있다. 하지만 TCHAR의 경우 위에서 말했듯이 문자집합에 따라 바뀌기 때문에 저런 부분을 고민할 필요가 없는 것이다.
이제부터 윈도우 프로그래밍을 할 때 문자열이 필요할 경우 TCHAR을 사용하자!!
=====================================================================================
※위에서 _T() 메크로가 나오는데 이 메크로의 역활은 문자집합으로 유니코드가 사용되면 유니코드 형식으로 바꾸어 주는 역할을 한다.
'WindowsPrograming' 카테고리의 다른 글
PostMessage (0) | 2009.07.15 |
---|---|
파일오픈, 세이브 (0) | 2008.04.21 |
CList의 내부 구조 이해 (0) | 2008.04.21 |