Menu
Coddy logo textTech

요약 - String 클래스

Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 104개 중 26번째.

challenge icon

챌린지

쉬움

이 장에서 배운 모든 생성자와 소멸자 개념을 결합하여, 자체적인 동적 문자 배열을 관리하는 완전한 String 클래스를 만들어 보겠습니다. 이것은 std::string이 내부적으로 어떻게 작동하는지를 보여주는 고전적인 연습 문제입니다.

코드를 정리하기 위해 두 개의 파일을 생성합니다:

  • String.h: Rule of Five를 따르는 String 클래스를 정의합니다. 클래스는 data라는 char* 포인터와 size_t length 멤버를 관리해야 합니다. 다음을 구현하세요:
    • 빈 문자열을 생성하는 기본 생성자 (널 종료 문자를 위해 단일 문자를 할당하고, 길이를 0으로 설정). "Default constructed"를 출력합니다.
    • C-문자열을 받아 새로 할당된 메모리에 복사하는 매개변수가 있는 생성자. "Constructed: <text>"를 출력합니다.
    • 다른 String의 깊은 복사(deep copy)를 수행하는 복사 생성자. "Copied: <text>"를 출력합니다.
    • 소유권을 이전하는 이동 생성자 (noexcept로 표시). 소스 객체를 null로 만들기 전의 텍스트를 사용하여 "Moved: <text>"를 출력합니다.
    • 메모리를 안전하게 해제하는 소멸자 (null 여부 확인). "Destroyed: <text>"를 출력합니다 (data가 null이거나 length가 0인 경우 "Destroyed: (empty)"를 출력).
    • 길이를 반환하는 size() 메서드
    • 문자 포인터를 반환하는 c_str() 메서드 (null인 경우 ""를 반환)
  • main.cpp: 모든 생성자가 함께 작동하는 것을 보여줍니다. 입력으로부터 텍스트 문자열을 읽은 후 다음을 수행합니다:
    • 기본 생성자를 사용하여 s1이라는 String을 생성합니다.
    • 입력 텍스트를 사용하여 s2라는 String을 생성합니다.
    • s2를 복사하여 s3라는 String을 생성합니다.
    • s2로부터 이동하여 s4라는 String을 생성합니다.
    • "--- Status ---"를 출력합니다.
    • 각 문자열(s1부터 s4까지)에 대해 "s<n>: \"<text>\" (length: <len>)"를 출력합니다.

효율성을 위해 모든 생성자에서 초기화 리스트를 사용하세요. 이동 후 s2는 길이가 0인 빈 상태여야 하며, s4는 원래 텍스트를 가지고 있어야 합니다. 마지막에 출력되는 소멸자 메시지는 네 개의 객체가 생성된 역순으로 정리되는 것을 보여줄 것입니다.

strlenstrcpy를 위해 <cstring>을, std::move()를 위해 <utility>를 포함하세요. 헤더 파일에 헤더 가드(header guards)를 잊지 마세요.

직접 해보기

#include <iostream>
#include <string>
#include "String.h"

using namespace std;

int main() {
    string input;
    getline(cin, input);

    // TODO: 기본 생성자를 사용하여 String s1 생성

    // TODO: 입력 텍스트를 사용하여 String s2 생성

    // TODO: s2를 복사하여 String s3 생성

    // TODO: s2로부터 이동하여 String s4 생성 (std::move 사용)

    // 상태 헤더 출력
    cout << "--- Status ---" << endl;

    // TODO: s1부터 s4까지 각 문자열의 상태 출력
    // 형식: "s<n>: \"<text>\" (length: <len>)"

    return 0;
}

객체 지향 프로그래밍의 모든 레슨