string은 연결리스트로 구현되어 길이가 가변적이고, 참조형 함수이기 때문에 메모리 사용에 안전하기 까지 하구나!
<aside> 💡 string은 단순히 읽는것뿐만이 아니라
대입과 덧붙이는것이 가능하다!

</aside>
<aside> 💡 C의 경우…

C에서 일단 뭐 대입이나 덧붙이는 것 비슷하게 할 수는 있었죠?
그래서 왼쪽의 C 코드 예를 보면
firstName에 문자열에 20개의 공간을 지정하고,"POPE"라는 4개의 문자를 넣었어요.
그러면 이 "POPER"네 글자만 공간을 차지하고 16개는 비어 있는 상태죠
그 다음에는
strcpy를 이용해 firstName의 "POPE"를 fullName에 복사하고
strcat을 이용해 fulltName에 " KIM"을 추가하여
최종적으로 "POPE KIM"을 만드는 과정이었습니다.
C에서는 사실 대입이라는 게 솔직히 없었죠
하지만 strcpy와 strcat을 사용한 방법은 안전하지 않아요, 왜?
strcpy(fullName, fisrtName)
strcpy()는 firstName은 몇 글자인지 몰라요
firstName은 그냥 포인터를 받기 때문에, 항상 firstName[0]만 알 뿐이다
만약 strcpy() 입력이 20글자 넘어가면 넘어서 써버린다면,
사용자가 <u>[**소유하지 않은 메모리를가져올 수 있어**](https://cybecho.notion.site/f791b62118794708b5017179e93c5c7d)</u> 안전하지 않다
즉, strcpy()는 scanf()를 사용했을때와 같이, <u>[**경계검사 문제**](https://cybecho.notion.site/C-scanf-adbeeca91246408e8be235f5c8f427c2)</u>가 있다!
C에서 덧붙이기는 strcat()을 사용했습니다
strcat()은
fullName변수 안에 "KIM" 문자열을 추가로 붙여 "POPE KIM" 으로 만드려는 의도인데,
strcat() 또한, 설정한 문자열의 길이보다 더 긴 문자가 들어왔을 경우, 마찬가지로
사용자가 <u>[**소유하지 않은 메모리를가져올 수 있어**](https://cybecho.notion.site/f791b62118794708b5017179e93c5c7d)</u> 안전하지 않다
즉, strcat()또한 scanf()를 사용했을때와 같이, <u>[**경계검사 문제**](https://cybecho.notion.site/C-scanf-adbeeca91246408e8be235f5c8f427c2)</u>가 있다!
</aside>
<aside> 💡 C++의 경우…는 일단 두 가지의 장점이 있음

첫번째는 우리가 흔히 알고 있는 부호사용이 가능하다는 것
기존 C에서는 strcpy()를 사용하여 대입했다면,
C++ 에서는 그냥 = 부호로 대입하고
기존 C에서는 strcat()를 사용하여 덧붙였다면,
C++ 에서는 그냥 += 부호로 대입한다
두번째는 훨씬 안전하다는것
std::string은 함수라서(char은 1바이트 자료형) 매개변수를 <u>[**참조**](https://cybecho.notion.site/Reference-57bea85a3b844dd5b3ac072fd85df9f0)</u>로 가져오기 때문에,
사용자가 <u>[**소유하지 않은 메모리를가져올 수 없어**](https://cybecho.notion.site/f791b62118794708b5017179e93c5c7d)</u> 안전하다!