char*)const char* str = "Hello";
\0 (null 문자)로 문자열 끝을 표시strlen(str) 함수 필요strcat, strcmp 등 함수 사용해야 함const char* s1 = "Hello";
const char* s2 = "World";
char buffer[100];
strcpy(buffer, s1);
strcat(buffer, s2); // "HelloWorld"
std::string)#include <string>
std::string str = "Hello";
+, ==, .size() 같은 연산자가 다 정의돼 있음 (편리!)std::string s1 = "Hello";
std::string s2 = "World";
std::string result = s1 + s2; // "HelloWorld"
std::cout << result.length(); // 10
std::string str = "Hello";
std::string은 **std::basic_string<char>**의 typedefchar* 배열을 동적으로 할당함 (heap 사용)delete 안 해도 됨namespace std {
typedef basic_string<char> string;
}
// 기본 구조는 대충 이렇게 생김
template<typename CharT>
class basic_string {
private:
CharT* data; // 문자열 저장 공간
size_t size;
size_t capacity;
public:
// 생성자, 대입연산자, 소멸자 등...
};
char 배열 또는 char*만 써도 문자열을 받을 수 있습니다. 실제로 C 언어에선 그 방식이 표준이죠.
그런데 C++에서 굳이 std::string을 쓰는 이유는 편리함과 안정성 때문이에요.
char 변수(배열)로 문자열 받기char name[100];
std::cin >> name;
std::cout << "Hello, " << name << std::endl;
길이 초과하면 메모리 침범 (buffer overflow)
→ name에 100자 넘게 입력하면 위험!
붙이기, 비교 불편
→ strcat(name, "님");, strcmp(name, "admin") 등 함수 따로 써야 함
동적 메모리 처리 복잡함
→ 길이를 모르면 malloc/new, free/delete 직접 관리해야 함
std::string 사용std::string name;
std::cin >> name;
std::cout << "Hello, " + name << std::endl;
길이 자동 조절
→ 몇 글자를 입력하든 알아서 메모리 확보
간단한 문자열 조작
→ +, +=, ==, .find(), .substr() 다 지원
메모리 자동 관리 (RAII)
→ new, delete, free 필요 없음
| 항목 | C-style 문자열 (char*) | C++ 문자열 (std::string) |
|---|---|---|
| 메모리 관리 | 수동 (new/delete 필요) | 자동 |
| 문자열 길이 | strlen() 필요 | .length() 또는 .size() |
| 문자열 붙이기 | strcat() | + 연산자 사용 가능 |
| 문자열 비교 | strcmp() | ==, <, != 등 비교 가능 |
| 안전성 | 낮음 (버퍼 오버플로우 위험) | 높음 (범위 검사, 예외 등) |
| 타입 | 포인터 (기본 타입) | 클래스 (객체 타입) |
std::string은 C-style 문자열보다 훨씬 편리하고 안전하며, 복잡한 메모리 관리도 자동으로 해주기 때문에 C++에서는 기본적으로std::string을 사용하는 것이 권장됩니다.