차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

문자열 [2010/02/26 04:24] (현재)
raychani 새로 만듦
줄 1: 줄 1:
 +{{tag>​it}}
 +====== 문자열 ======
 +컴퓨터 언어에서 **문자열(string)**은 문자(character)들의 연결을 말한다. 지금 보이고 있는 이 문장도 문자열의 한 예이다. 이 페이지에서는 주로 C/C++에서 사용되고 있는 문자열에 대해 간략히 짚어본다.
 +
 +===== 문자열의 분류 =====
 +C/​C++언어에서 문자열을 분류할 수 있는 방법은 두 가지이다. 첫째는 **한 문자를 저장하는 데 필요한 크기**에 때라 분류하는 방법이고,​ 둘째는 **문자 배열인가 문자열을 위한 전용 자료형인가**로 분류하는 방법이다. 이 두가지 방법의 조합으로 주로 4가지 형태의 문자열 표현 방법이 존재한다.
 +
 +==== 자료형으로 분류 ==== 
 +C언어에서는 문자열을 다루기 위한 전문 자료형을 제공하지 않았고, 객체 지향을 지원하지 않기 때문에 지원하는 것도 거의 불가능했다. 따라서 C언어에서는 문자열을 다루기 위해 문자의 배열을 이용하고 이를 다루기 위한 str???​함수들을 제공하였다. 이 방법은 나쁜 방법은 아니지만 불편하고,​ 특히 배열 인덱스 초과나 포인터 사용 실수 인한 오류 가능성이 높다.
 +
 +C++언어는 객체지향을 지원하므로 이를 이용한 다양한 문자열 자료형이 등장하였다. 이 방식은 오류 가능성이 적고 편하다. 가장 대표적인 것이 STL의 string과 MFC의 CString이다. 개인적으로 CString가 편하나 STL은 표준이다. MFC로 GUI를 만드는 것이 아니라면 string을 추천한다. 닷넷(.NET)의 String도 있으나 C++환경에서 사용하기에 어색한 느낌이 강하다.
 +
 +==== 문자의 크기로 분류 ====
 +문자의 크기로 분류하는 방법 중 가장 널리 사용되는 것은 MBCS(Multi Byte Character String)과 Unicode이다. MBCS는 영숫자는 1바이트, 그 외의 문자는 여러 바이트(보통 2바이트)로 표시하고,​ Unicode는 모든 문자를 같은 크기의 바이트(보통 2바이트)로 표시한다. 인터넷에서는 UTF-8이 표준으로 사용되고 있으나 컴퓨터 언어에서는 사용되지 않는다.
 +
 +MBCS는 가장 널리 사용되던 방식이다. C/​C++언어에서 MBCS문자열은 "​~~"​로 표현한다. stl의 string이 MBCS 방식을 사용한다. 윈도우 98까지도 아마 내부적으로 이 방식이 쓰인 것 같다. 또한 컴퓨터 언어 입문에서 널리 사용된 Visual C++ 6.0에서는 별도의 설정을 하지 않은 경우 이 방식을 사용하고,​ Unicode 관련 라이브러리는 아예 설치되지도 않았다. 환경이 이렇다보니 별 생각없이 MBCS로 문자열을 다뤘지만 이 방법은 문제가 많다. 조합형 한글 중 일부 깨지는 문자(똠)가 생기는 것은 물론 한 문자를 제대로 다룰 수도 없다. "​한글"​. 따옴표 안에 몇 글자가 있는가? strlen("​한글"​);​ string("​한글"​).length();​ 그렇다면 이것들은 몇을 반환할까?​ 2글자이지만 4를 반환한다. 유일한 장점이라면 일반적인 환경에서 Unicode보다 문자열 저장에 필요한 공간을 덜 차지한다는 것이다.
 +
 +Unicode는 최근에 널리 사용되고 있는 방식이다. 모든 글자를 동일한 크기의 바이트로 표현한다. 주로 2바이트이지만 3바이트 4바이트라도 유니코드이다. C/​C++언어에서 유니코드 문자열은 **L**"​~~"​로 표현하여야 한다. 자바, C# 등은 Unicode만을 사용해서 간편하고 그냥 "​~~"​으로 표현한다. ​ stl의 wstring은 이 방식을 사용한다. Visual Studio 2005에서는 기본 설정이 유니코드로 되어있다. NT 커널이 사용된 운영체제(대중적으로는 윈도우 2000, 윈도우 XP)에서는 내부적으로 유니코드를 사용하고 있는 것 같다. 조합형 한글을 문제없이 표현할 수 있고, 한글자를 다루는데도 전혀 문제가 없다. **특별한 이유가 없는 한 유니코드를 사용하자.**
 +
 +C/​C++에서는 이 두 가지 방법을 매크로를 이용하여 사용하는 경우가 많다. 코딩을 할 때 char, wchar_t를 이용하는 것이 아니라 TCHAR을 이용하고 _MBCS, _UNICODE 둘 중 정의된 매크로에 따라 자동으로 적절한 자료형이 선택된다. stl의 string, wstring는 이것을 지원하지 않으나 다음과 같은 코드를 헤더에 추가하고 tstring을 이용할 수 있다.
 +<​code>​
 +#ifdef _UNICODE
 + #define tstring wstring
 +#else
 + #define tstring string
 +#endif
 +</​code>​
 +
 +비교
 +
 +^ ^  MBCS  ^  Unicode ​ ^  매크로 ​ ^
 +^  문자 ​ |  char  |  wchar_t ​ |  TCHAR  |
 +^  문자열 함수 이름 ​ |  str??? ​ |  wcs??? ​ |  _tcs??? ​ |
 +^  문자열 ​ |  string ​ |  wstring ​ |  (tstring) ​ |
 +
 +~~LINKBACK~~
 +~~DISCUSSION~~