문자열
C / C++에서 문자열은 끝이 NULL 로 끝나는 단순한 배열
입니다.
'문자' 는 특정한 정의에(character set)에 의해 의미가 부여된 숫자이며, '문자열' 은 '문자' 들의 '배열' 이라고 볼 수 있습니다.
문자열 클래스
C / C++ 에서의 문자열에 대한 정의는 단순합니다.
우선 '배열' 과의 구분이 없기 때문에 다른 데이터 타입과 혼용될 가능성이 있습니다.
문자 하나를 뜻하는 char 형은 컴파일러에 따라 다르긴 하지만, 흔히 1byte 의 자료형으로 취급되는데 이 때문에 byte 의 역할도 있습니다.
- byte 는 raw data 를 다루기에 좋은 자료형입니다.
문자열을 조작하기 위해서는 별도의 함수들을 호출해야 합니다.
자주 사용하는 알고리즘은 한정적이고, 문자열에 대해서만 사용하는 경우가 많기 때문에 높은 결합도를 가집니다.
객체 지향적 관점에서 문자열 메소드를 묶어 클래스로 만들면, 연산자 오버로딩을 통해 함수 호출 보다 직관적인 코드를 확보할 수 있습니다.
#include <iostream>
#include <cstring>
//for compatibility
#ifdef _MSC_VER
#define STRCPY(A,B,C) strcpy_s(A,B,C)
#define STRCAT(A,B,C) strcat_s(A,B,C)
#else
#define STRCPY(A,B,C) strcpy(A,C)
#define STRCAT(A,B,C) strcat_s(A,C)
#endif
class String
{
private:
char* buffer;
public:
String()
{
this->buffer = new char[2];
STRCPY(this->buffer, 2, "");
}
String(int size)
{
if (size < 2)
size = 2;
this->buffer = new char[size];
STRCPY(this->buffer, 2, "");
}
String(const String &rhs)
{
int length = strlen(rhs.buffer) +1;
this->buffer = new char[length];
STRCPY(this->buffer, length, rhs.buffer);
}
~String()
{
delete[] buffer;
}
String(const char* str)
{
int length = strlen(str) + 1;
this->buffer = new char[length];
STRCPY(this->buffer, length, str);
}
String& operator =(const char* str)
{
unsigned int length = strlen(str) + 1;
if (length > strlen(buffer))
{
delete[] buffer;
this->buffer = new char[length];
STRCPY(this->buffer, length, str);
}
else
STRCPY(this->buffer, length, str);
return *this;
}
String& operator =(const String& rhs)
{
unsigned int length = strlen(rhs.buffer) + 1;
if (length > strlen(buffer))
{
delete[] buffer;
this->buffer = new char[length];
STRCPY(this->buffer, length, rhs.buffer);
}
else
STRCPY(this->buffer, length, rhs.buffer);
return *this;
}
String operator + (const char* str)
{
int length = strlen(buffer) + strlen(str) + 1;
String newStr(length);
STRCPY(newStr.buffer, length, this->buffer);
STRCAT(newStr.buffer, length, str);
return newStr;
}
operator const char* ()
{
return buffer;
}
};
int main(int argc, char** argv)
{
String temporaryStr("it is example");
printf("%s\n", (const char*)temporaryStr);
temporaryStr = temporaryStr + " of string class";
printf("%s\n", (const char*)temporaryStr);
temporaryStr = "Done";
printf("%s\n", (const char*)temporaryStr);
return 0;
}
it is example
it is example of string class
Done
문자열 클래스의 몇 가지 기능을 간단히 구현해 본 예제 코드이며, 매크로 함수는 호환성 때문에 지정하였습니다.
- 각 길이를 구할 때 +1을 해 주는 것에 주의해야 하는데, NULL 값이 들어갈 자리를 확보하기 위함입니다.
string 클래스
C / C++ 의 표준 문자열 헤더 <string> 에는 string 클래스가 포함되어 있습니다.
#include <iostream>
#include <string>
int main(int argc, char** argv)
{
std::string temporaryStr("it is example");
printf("%s\n", temporaryStr.c_str());
temporaryStr = temporaryStr + " of string class";
printf("%s\n", temporaryStr.c_str());
temporaryStr += " test";
printf("%s\n", temporaryStr.c_str());
printf("length : %d\n", temporaryStr.length());
temporaryStr = "Done";
printf("%s\n", temporaryStr.c_str());
return 0;
}
it is example
it is example of string class
it is example of string class test
length : 34
Done
이 클래스를 활용하면 편리하게 문자열의 관리를 할 수 있습니다.
C++ 스타일의 표준 입출력은 string 클래스를 그대로 사용할 수 있으며,
C 스타일의 배열을 얻고 싶을때는 c_str 메소드를 호출할 수 있습니다.