[C++] 문자열을 다룰 때 조심해야하는 이유 - 문자열 복사
2023. 8. 21. 17:56ㆍ프로그래밍 언어/C++\C
문자열을 복사하거나 참조할 때 조심해야 한다. 문자열은 불변 객체이므로 조작 시 새로운 문자열이 생길 수 있다.
#include <iostream>
#include <string>
int main() {
std::string original = "Hello, World!";
std::string copied = original; // 문자열 복사
// original과 copied는 다른 객체처럼 보이지만,
// 실제로는 같은 문자열 데이터를 가리키고 있다.
// 문자열 데이터의 주소를 출력해보면 두 문자열이 같은 주소를 가리키는 것을 확인할 수 있다.
std::cout << "Original address: " << &original << std::endl;
std::cout << "Copied address: " << &copied << std::endl;
original[7] = 'X';
std::cout << "Original: " << original << std::endl; // "Hello, WXrld!"
std::cout << "Copied: " << copied << std::endl; // "Hello, World!"
return 0;
}
이처럼 copied와 original이 같은 주소의 데이터를 가리키는데도 original을 변경하면 copied는 변경되지 않는다. 그 이유는 string이 불변객체로 구현되어 있기 때문이다.
불변 객체란, 한 번 생성되면 내부 데이터가 변경되지 않는 객체를 말한다. 문자열의 내용을 변경하는 대신 새로운 문자열을 생성하고 변경된 내용을 새로운 문자열에 저장하는 방식으로 작동하기에 original을 변경해도 copied는 변경되지 않는다. 다시 정리하자면 string은 불변 객체이기에 original의 일부 문자를 변경하면 새로운 문자열이 생성되고 그 문자열을 original이 가리킨다. 따라서 original의 일부 문자를 변경하면 original이 가리키는 데이터의 주소가 바뀐다.
이런 설계를 이용하면 문자열을 복사하면서도 성능상 이점을 유지하면서 문자열의 불변성을 보장할 수 있다. 원본 문자열을 유지하면서 반복문을 돌리면서 문자열의 임시 변경이 필요할 때 매 반복마다 원본 문자열을 복사할 필요가 없는 것처럼 말이다.
'프로그래밍 언어 > C++\C' 카테고리의 다른 글
[C++] 2차원 배열과 벡터의 동적 할당 (0) | 2023.09.06 |
---|---|
[C++] 네임스페이스와 ::연산자 - 코드 구조화와 충돌 방지의 핵심 (0) | 2023.08.22 |
[C++] 문자열의 기초부터 꼭 알아야 할 메서드들까지 (0) | 2023.08.21 |
[C++] STL에서의 unordered_map사용법과 map과의 차이점, unordered_set 사용법 (1) | 2023.08.21 |
[C++] Stack, Queue, 우선순위 큐에 구조체 넣는 법 (0) | 2023.08.16 |