본문 바로가기

IT/개발공부

C++로 String 객체 구현하기!

반응형

 

본 게시물은 개인 공부용이기 때문에, 정확하지 않은 내용이 있을 수 있습니다.

 

 

 

 

 

안녕하세요. 열정열정열정 개발자입니다.

 

 

 

 

String은 문자열 객체로써, 다음 코드와 같이 사용할 수 있습니다.

string str1;						//빈 문자열 생성
cin >> str1; 						//문자열 입력받기
cout << "str1 : " << str1 << '\n';	//입력받은 문자열 출력

 string str2 = "abcdef";			//"abcedf" 문자열 생성
 cout << "str2 : " << str2 << '\n';	//"abcedf" 문자열 출력

 

 

 

이러한 String 객체의 클래스가 어떠한 구조로 되어있는지 궁금하여,

직접 구현해 보기로 하였습니다.

 

 

 

 

 

 

C++로 String 구현

 

 

 

공부하면서 String을 구현한 코드입니다.

 

#include <iostream>
#include <cstring>


class String {

public:
    char* m_data;                                           //문자열 데이터를 가리키는 동적 할당된 문자열 포인터. (new 연산자를 사용하여 메모리를 동적으로 할당하고, delete[] 연산자를 사용하여 메모리를 해제)
    int m_length;                                           //문자열의 길이를 나타내는 변수. (std::strlen() 함수를 사용하여 입력된 문자열의 길이를 계산하여 저장)

    // 생성자
    String(const char* input = "") {                        //문자열을 입력받아 String 객체를 생성. 인자로 전달된 문자열의 길이를 계산하고,
        m_length = static_cast<int>(std::strlen(input));    //strlen -> 문자열 길이 반환. static_cast -> 변환 연산자(int로)(컴파일 타임에 형식을 변환)
        m_data = new char[m_length + 1];                    //길이 + 1 크기의 메모리를 할당.
        strcpy_s(m_data, m_length + 1, input);              //문자열을 복사
    }

    // 복사 생성자
    String(const String& other) {
        m_length = other.m_length;
        m_data = new char[m_length + 1];
        strcpy_s(m_data, m_length + 1, other.m_data);
    }

    // 대입 연산자
    String& operator=(const String& other) {                //한 String 객체를 다른 String 객체에 대입.
        if (this != &other) {                               //자기 자신과 대입 대상이 같은 객체인지 확인.
            delete[] m_data;                                //기존 메모리를 해제
            m_length = other.m_length;
            m_data = new char[m_length + 1];                //새로운 메모리를 할당
            strcpy_s(m_data, m_length + 1, other.m_data);   //문자열을 복사
        }
        return *this;
    }

    // 소멸자                                              //객체가 소멸될 때 호출되는 함수,
    ~String() {
        delete[] m_data;                                   //동적으로 할당한 메모리를 해제.
    }

    const char* c_str() const {
        return m_data;
    }
};

int main()
{
    String hello = "hello, world!";                     //String 객체 hello를 생성하고 문자열 "hello"로 초기화
    std::cout << hello.c_str() << std::endl;            //hello 객체의 c_str() 함수를 호출하여 저장된 문자열을 출력
}

String 클래스를 만들어 주었고,

생성자로 하여 문자열을 입력받으면 문자열의 크기만큼 메모리를 할당하여 문자열을 복사하도록 하였습니다.

또한 객체의 복사, 대입을 대비하여 복사 생성자와 대입 연산자 함수를 만들어 주었고,

객체가 소멸될 때에는 메모리를 해제하도록 하였습니다. 

 

c_str 함수를 이용해서 객체에 저장된 문자열을 호출할 수 있도록 만들었습니다.

 

 

 

 


+

저는 객체의 복사와 대입에 대해서 공부하면서 이해하기 어려웠던 부분이 많았습니다.

그래서 공부했던 내용도 같이 올려봅니다.

 

 

 

객체의 복사와 대입

사실 말이 조금 어려워 보이지만

평소에 저희가 코드를 입력하면서 자주 입력했던 부분이었습니다.

 

 

 

다음 코드는 객체 복사의 예입니다.

String str1 = "Hello"; // 일반 생성자 호출
String str2 = str1;   // 복사 생성자 호출

일반 생성자를 호출한 후, 그 생성자를 str2에 복사하는 경우입니다.

이 경우에 복사 생성자가 호출되게 됩니다.

그러면 str2의 객체에 str1의 문자열 크기만큼의 메모리가 할당되고 문자열이 복사됩니다.

 

 

 

 

다음 코드는 객체 대입의 예입니다.

String str1 = "Hello";
String str2;
str2 = str1;   // 대입 연산자 호출

이 경우는 str1 객체를 Hello로 초기화 시켜준 뒤, str2 객체를 생성하고 str2에 str1의 값을 대입하는 경우입니다.

대입 연산자가 호출되면서 str2와 str1이 같은 값인지를 비교하게 되고

다른 값일 경우, str1의 문자열 크기만큼 메모리를 할당하고 문자열을 복사하게 됩니다.

 

 

 

 

반응형