문자열 (String)

사실상 String 풀 요약

string은 연결리스트로 구현되어 길이가 가변적이고, 참조형 함수이기 때문에 메모리 사용에 안전하기 까지 하구나!

<aside> 💡 string은 단순히 읽는것뿐만이 아니라

대입과 덧붙이는것이 가능하다!

Untitled

</aside>

<aside> 💡 C의 경우…

Untitled

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++의 경우…는 일단 두 가지의 장점이 있음

Untitled

첫번째는 우리가 흔히 알고 있는 부호사용이 가능하다는 것

기존 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> 안전하다!