Qaupot Blog
Software Engineering, Trip

307. 문자열 클래스

🕐 Sun, 02 Mar 2014 09:00:00 GMT 🕓 Sun, 05 Sep 2021 12:21:00 GMT

문자열

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 메소드를 호출할 수 있습니다.

이 블로그는 개인 블로그입니다. 게시글은 오류를 포함하고 있을 수 있지만, 저자는 오류를 해결하기 위해 노력하고 있습니다.
게시글에 별도의 고지가 없는 경우, 크리에이티브 커먼즈 저작자표시-비영리-변경금지 4.0 라이선스를 따릅니다.

This blog is personal blog. published posts may contain some errors, but author doing efforts to clear errors.
If post have not notice of license, it under creative commons Attribution-NonCommercial-NoDerivatives 4.0.