All is well

[YYBASIC0401/얌얌코딩] std::string 클래스 만들어보기 본문

C++/YYBASIC

[YYBASIC0401/얌얌코딩] std::string 클래스 만들어보기

D0YUN 2025. 3. 14. 16:45
#include <iostream>

namespace ya
{
    class string
    {
    public:
        // 기본 생성자: mStr을 nullptr로 초기화하여 정의되지 않은 동작을 방지
        // 멤버 이니셜라이저(:)를 사용하여 mStr을 직접 초기화함으로써 불필요한 대입을 방지하고 성능 최적화
        string() : mStr(nullptr)
        {
            std::cout << "nullptr\n";  // 디버깅용: 기본 생성자가 호출되었음을 알림
        }

        // C 스타일 문자열을 사용하여 객체를 초기화하는 생성자
        // 멤버 이니셜라이저(:)를 사용하여 mStr을 nullptr로 초기화한 후, 동적 할당을 통해 문자열을 저장
        string(const char* str) : mStr(nullptr)
        {
            // str이 null이 아님을 가정하고, 입력 문자열의 길이를 계산
            int len = strlen(str);

            // 문자열과 널 종료문자('\0')를 저장할 메모리를 동적으로 할당
            mStr = new char[len + 1];

            // 문자열을 한 글자씩 복사
            for (size_t i = 0; i < len; i++)
            {
                mStr[i] = str[i];
                std::cout << mStr[i] << '\n';  // 디버깅용: 복사되는 문자 출력
            }

            std::cout << "\n";  // 디버깅용: 복사 완료 후 줄바꿈 출력

            // 문자열 끝에 널 종료문자('\0')를 추가하여 올바른 문자열 형식을 유지
            mStr[len] = '\0';
        }

        // 소멸자: 동적으로 할당된 메모리를 해제하여 메모리 누수를 방지
        ~string()
        {
            delete[] mStr;
        }

    private:
        // 문자열을 저장하는 동적 할당된 메모리의 포인터
        char* mStr;
    };
}

int main()
{
    // 표준 라이브러리의 std::string을 선언 및 초기화
    std::string hello = "Hello!";

    // 기본 생성자로 ya::string 객체를 생성 (mStr이 nullptr로 초기화됨)
    ya::string yaHello1;

    // 기본 생성자를 사용한 임시 객체를 생성한 후, 이를 yaHello2에 복사하여 초기화
    // 주의: 
    // 1. C++ 컴파일러는 최적화를 통해 불필요한 복사를 줄이는 RVO(Return Value Optimization)를 수행할 수도 있음
    // 2. 하지만 일부 컴파일러나 특정 상황에서는 RVO가 적용되지 않아 객체가 복사될 가능성이 있음
    // 3. 즉, yaHello2는 ya::string()을 호출하여 생성된 임시 객체에서 복사되지만, 
    //    RVO가 적용되지 않으면 불필요한 복사 생성자가 호출될 수도 있으므로 권장되지 않음
    ya::string yaHello2 = ya::string();

    // C 스타일 문자열을 사용하여 ya::string 객체를 초기화
    ya::string yaHello3 = "Hello!";  // 문자열을 받는 생성자 호출
    ya::string yaHello4("Hello!");   // 동일한 방식의 객체 초기화

    return 0;
}

 
 

// 디버깅용 코드 실행 결과

 
 
 
LV12 string 클래스 만들어보기