요약 - String 클래스
Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 104개 중 26번째.
챌린지
쉬움이 장에서 배운 모든 생성자와 소멸자 개념을 결합하여, 자체적인 동적 문자 배열을 관리하는 완전한 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인 경우""를 반환)
- 빈 문자열을 생성하는 기본 생성자 (널 종료 문자를 위해 단일 문자를 할당하고, 길이를 0으로 설정).
main.cpp: 모든 생성자가 함께 작동하는 것을 보여줍니다. 입력으로부터 텍스트 문자열을 읽은 후 다음을 수행합니다:- 기본 생성자를 사용하여
s1이라는String을 생성합니다. - 입력 텍스트를 사용하여
s2라는String을 생성합니다. s2를 복사하여s3라는String을 생성합니다.s2로부터 이동하여s4라는String을 생성합니다."--- Status ---"를 출력합니다.- 각 문자열(s1부터 s4까지)에 대해
"s<n>: \"<text>\" (length: <len>)"를 출력합니다.
- 기본 생성자를 사용하여
효율성을 위해 모든 생성자에서 초기화 리스트를 사용하세요. 이동 후 s2는 길이가 0인 빈 상태여야 하며, s4는 원래 텍스트를 가지고 있어야 합니다. 마지막에 출력되는 소멸자 메시지는 네 개의 객체가 생성된 역순으로 정리되는 것을 보여줄 것입니다.
strlen과 strcpy를 위해 <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;
}