반응형

 

1. 기본 생성자 (빈 문자열)

#include <string>
#include <iostream>
using namespace std;

int main() {
    string s1; // 빈 문자열
    cout << "s1: \"" << s1 << "\"\n"; 
}

 

그냥 string s1; 이런식으로 선언할 경우,

내용이 없는 빈 문자열로 초기화됩니다.   내부적으로 ""와 동일합니다.

 

출력화면:

s1: ""

 

 

2. 기본 생성자 (멤버변수로서 string을 가지는 경우)

#include <string>
#include <iostream>
using namespace std;

class M {
public:
	string s2;
};

int main() {
	M a;
	cout << "a.s2: " << a.s2 << endl;

	if (a.s2.empty()) {
		cout << "a.s2 is empty" << endl;
	}
}

 

출력화면:

a.s2:
a.s2 is empty

 

 

3. C-문자열로 초기화

- const char* 타입 문자열 리터럴로 초기화.

string s2 = "Hello";  // 복사 초기화 (Copy initialization)
string s3("Hello");   // 직접 초기화 (Direct initialization)


"Hello"는 C 스타일 문자열이지만, std::string 생성자가 자동 변환합니다.
위 두 코드는 C++11 이후 대부분의 경우 차이가 없습니다. (컴파일러 최적화로 동일 코드 생성).

 

4. 다른 std::string으로 초기화 (복사 생성)

기존 string의 문자열 내용을 그대로 복사합니다.

string original = "World";
string copy1(original);  // 복사 생성자
string copy2 = original; // 복사 대입

 

 

5. 부분 문자열로 초기화

(원본문자열, 시작위치[, 길이]) 형태로 부분 문자열을 초기화할 수 있다.

string text = "Hello World";
string sub(text, 6);         // "World" (6번째 인덱스부터 끝까지)
string sub2(text, 0, 5);     // "Hello" (0부터 5글자)



6. 반복 문자로 초기화

(반복횟수, 문자) 형태로 문자열을 초기화한다.

string s4(5, 'A'); // "AAAAA"

 

 

7. char* + 길이로 초기화

C 문자열의 일부만 가져올 때 유용합니다.

const char* arr = "HelloWorld";
string s5(arr, 5); // "Hello" (앞에서 5글자만)

 

8. std::string + 이터레이터로 초기화

임의 범위를 잘라서 초기화할 수 있습니다.
STL 컨테이너 간에도 활용 가능.

string source = "ABCDEFG";
string s6(source.begin() + 2, source.begin() + 5); // "CDE"

 

9. std::move를 사용한 이동 초기화

복사 대신 메모리를 이동시켜 성능을 높일 때 사용.

string temp = "Temporary";
string moved(std::move(temp)); // temp는 비워지고, moved가 내용 가져감

 

 

10. std::to_string 사용 (숫자 → 문자열 변환)

숫자 → 문자열 변환 시 유용.

int num = 42;
string s7 = to_string(num); // "42"




11. 동적 char 배열을 string으로 초기화방법

std::string은 내부적으로 동적 메모리를 관리하므로, char*처럼 직접 메모리 해제를 할 필요가 없습니다.
복사 초기화(=)와 직접 초기화(())는 성능 면에서 거의 동일하나, 일부 경우 explicit 생성자 차이로 동작이 다를 수 있습니다.

 

중요: std::string은 인자로 받은 char* 내용을 복사합니다.
→ 따라서 원본 char*는 나중에 delete[]로 안전하게 해제해도 됩니다.

(char 배열은 delete 꼭 해주어야함)

#include <iostream>
#include <string>
using namespace std;

int main() {
    char* dyn = new char[6]; // 동적 char 배열
    dyn[0] = 'H';
    dyn[1] = 'e';
    dyn[2] = 'l';
    dyn[3] = 'l';
    dyn[4] = 'o';
    dyn[5] = '\0'; // 문자열 끝 표시(널 문자)

    string s1(dyn);   // 직접 초기화
    string s2 = dyn;  // 복사 초기화

    cout << s1 << endl;

    delete[] dyn; // 메모리 해제 (string이 복사본을 가지고 있으므로 안전)
}

 

12. char* 배열을 string 배열에 초기화방법

(char 배열은 delete 꼭 해주어야함)

#include <iostream>
#include <string>
#include <vector>

int main() {
    // 1. 동적으로 할당된 char 배열
    const int num_strings = 3;
    const int max_len = 20;

    // char 배열을 동적으로 할당하고 값 설정
    char** dynamic_char_array = new char*[num_strings];
    dynamic_char_array[0] = new char[max_len];
    dynamic_char_array[1] = new char[max_len];
    dynamic_char_array[2] = new char[max_len];

    strcpy(dynamic_char_array[0], "Hello");
    strcpy(dynamic_char_array[1], "World");
    strcpy(dynamic_char_array[2], "C++");

    // 2. std::string 배열 초기화
    // std::vector<std::string>을 사용하는 것이 더 효율적입니다.
    std::vector<std::string> string_vector(num_strings);

    for (int i = 0; i < num_strings; ++i) {
        string_vector[i] = std::string(dynamic_char_array[i]);
    }

    // 결과 출력
    for (const auto& s : string_vector) {
        std::cout << s << std::endl;
    }

    // 3. 메모리 해제
    for (int i = 0; i < num_strings; ++i) {
        delete[] dynamic_char_array[i];
    }
    delete[] dynamic_char_array;

    return 0;
}


13. 길이 지정해서 초기화

동적 배열이 널 문자로 끝나지 않았거나, 특정 길이만 쓰고 싶을 때:

char* dyn = new char[10]{'H','e','l','l','o'}; // '\0' 없음
string s3(dyn, 5); // 앞 5글자만 사용
반응형