[cpp] char*과 std::string

minjubyeon·2025년 6월 14일

cpp

목록 보기
17/26

1. C-style 문자열 (char*)

const char* str = "Hello";
  • 문자 배열 (char array) 또는 포인터를 사용해서 문자열을 나타냄
  • 끝에 \0 (null 문자)로 문자열 끝을 표시
  • 문자열 길이를 구하려면 strlen(str) 함수 필요
  • 문자열 붙이기(concat), 비교하려면 strcat, strcmp 등 함수 사용해야 함
const char* s1 = "Hello";
const char* s2 = "World";
char buffer[100];
strcpy(buffer, s1);
strcat(buffer, s2);  // "HelloWorld"



2. C++ 스타일 문자열 (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

2.1 std::string 내부 동작

std::string str = "Hello";
  • std::string은 **std::basic_string<char>**의 typedef
  • 내부적으로는 char* 배열을 동적으로 할당함 (heap 사용)
  • 복사 생성자, 대입 연산자, 소멸자 등 모두 구현되어 있음 (RAII 기반)
  • 메모리 자동 관리: 사용자가 delete 안 해도 됨
namespace std {
    typedef basic_string<char> string;
}
// 기본 구조는 대충 이렇게 생김
template<typename CharT>
class basic_string {
private:
    CharT* data; // 문자열 저장 공간
    size_t size;
    size_t capacity;
public:
    // 생성자, 대입연산자, 소멸자 등...
};



3. 🔍 char type과 std::string의 차이는 무엇인가?

char 배열 또는 char*만 써도 문자열을 받을 수 있습니다. 실제로 C 언어에선 그 방식이 표준이죠.
그런데 C++에서 굳이 std::string을 쓰는 이유는 편리함과 안정성 때문이에요.


📦 예: char 변수(배열)로 문자열 받기

char name[100];
std::cin >> name;
std::cout << "Hello, " << name << std::endl;

❌ 문제점 :

  1. 길이 초과하면 메모리 침범 (buffer overflow)
    name에 100자 넘게 입력하면 위험!

  2. 붙이기, 비교 불편
    strcat(name, "님");, strcmp(name, "admin") 등 함수 따로 써야 함

  3. 동적 메모리 처리 복잡함
    → 길이를 모르면 malloc/new, free/delete 직접 관리해야 함




📦 예: std::string 사용

std::string name;
std::cin >> name;
std::cout << "Hello, " + name << std::endl;

✅ 장점:

  1. 길이 자동 조절
    → 몇 글자를 입력하든 알아서 메모리 확보

  2. 간단한 문자열 조작
    +, +=, ==, .find(), .substr() 다 지원

  3. 메모리 자동 관리 (RAII)
    new, delete, free 필요 없음



⚠️ 차이점 (char* vs std::string)

항목C-style 문자열 (char*)C++ 문자열 (std::string)
메모리 관리수동 (new/delete 필요)자동
문자열 길이strlen() 필요.length() 또는 .size()
문자열 붙이기strcat()+ 연산자 사용 가능
문자열 비교strcmp()==, <, != 등 비교 가능
안전성낮음 (버퍼 오버플로우 위험)높음 (범위 검사, 예외 등)
타입포인터 (기본 타입)클래스 (객체 타입)



🔚 결론

std::string은 C-style 문자열보다 훨씬 편리하고 안전하며, 복잡한 메모리 관리도 자동으로 해주기 때문에 C++에서는 기본적으로 std::string을 사용하는 것이 권장됩니다.



profile
안녕하세요.

0개의 댓글