
https://github.com/POCU/COMP3200CodeSamples
<aside> 💡 목차
</aside>
<aside> 💡 string 길이는 가변적이라 좋다며?
→ 그래 맞아, 그러면 가변적인 string을 어떻게 구현할건데?
→ String을 초기화하고, 값을 대입하고, 더 큰 영역을 사용하기 위해 메모리를 재할당하는 과정을 순차적으로 알아보자
</aside>
<aside> 💡 String 변수 초기화


스택(좌측 붉은 박스)의 내용을 요약하면 다음과 같습니다
ptr(포인터)는 실제 메모리에 문자가 저장된 첫번째 주소를 가르키구요
capacity(최대용량)이 15글자까지 넣을 수 있고요,
size(문자열 길이) char 아 string 길이는 0입니다, 왜? 아직 아무것도 없으니까!
string 클래스가 실제 내부적으로 어떻게 동작하는지 아 이제 대충 보여드리려고 다음 예시를 가져왔슴돠
string 클래스가 처음 만들어질 때,
이런 식으로(노란색부분) 기본적으로 실제 캐릭터들을 모두 내부에 저장을 해요.
내부에 저장을 하기 때문에 이거는 이제 기본적으로 이젠 플랫폼마다, 컴파일러마다 다른데,
일단 해당 플랫폼에서는 내부적으로 char 어레이 16바이트를 미리 잡아준 것이죠.
이건 결국 '나는 총 15개의 char를 받을 수 있어!' 라는것을 의미하겠죠?
용량정보, 길이정보, 포인터정보 자체는 스택에 있지만,
실제 문자 char 16개는 16바이트 메모리는 힙에 존재해요.
힙에 있어야 하는 이유는, 실제 문자열은 동적으로 좀 변해야 하기 떄문입니다.
이게 시작 단계예요,
그럼 이 포인터는 힙 16바이트 가리키고 있다!
...라고 이해하면 되겠죠?
</aside>
<aside> 💡 String 변수에 4바이트 이하의 값 대입


아직 용량은 늘어나지 않는다
자 두 번째 단계로 우리가 "POPE"를
대입하려고 해요, 그럼 어떤 일이 일어나나 볼까요?
일단 "POPE"를 보니까 4바이트가 필요해요,
근데 이미 현재 길이가 0바이트고, 전체 용량이 15바이트니까 (1바이트 null 제외)
4바이트를 전부 넣을 수자 있겠네요?
"POPE"문자열 자체는 char 어레이였죠?
char 어레이는 메모리에 strcpy() 혹은 memcpy() 을 통해 넣었죠?
"POPE"는 이미 메모리 어딘가에 존재한다고 가정을 해서, "POPE" 메모리를 복사해서
16바이트 line변수에 복사한 메모리값 4바이트를 넣는거죠.
</aside>
<aside> 💡 기존 문자열 변수에 4바이트를 초과하는 문자열 덧붙이기


이제 덧붙이기를 하려고 해요
덧붙이려는 문자는 다음과 같습니다
"C++ is awesome, isn't?"
그런데 이거 딱 보기만 봐도 이거 11바이트가 넘죠?
저희는 지금 16바이트에 4바이트 "POPE" 와 1바이트의 "\0" 이 들어가 있는 상태인데
현재 line에는 들어갈 수 없다는것을 알 수 있죠.
</aside>
<aside> 💡 S기존 문자열 변수에 4바이트를 초과하는 문자열 덧붙이기


그럼 어떻게 하냐?
원래는 line변수에 16바이트 공간 잡아놨었잖아요?
"아 그럼 난 메모리가 추가로 필요하니까 추가로 32비트 잡아야지!"
32바이트 메모리를 **새로 잡아요**,
</aside>
<aside> 💡 기존 문자열 변수에 4바이트를 초과하는 문자열 덧붙이기


그다음에 원래 line변수에 있던 "POPE"라는 걸 복사해서
새로 할당한 32바이트 메모리영역 첫번째에 붙여넣어요.
</aside>
<aside> 💡 기존 문자열 변수에 4바이트를 초과하는 문자열 덧붙이기


이제 기존 16바이트 메모리 영역에 있던 "POPE"를 복사했으니까,
이전 16바이트 메모리는 필요가 없어지죠?
전 메모리 free()를 통해 지워버리고,
line의 포인터를 새롭게 할당한 32바이트 메모리의 첫번째 주소로 바꿔줍니다.
</aside>
<aside> 💡 기존 문자열 변수에 4바이트를 초과하는 문자열 덧붙이기


그리고 그다음에 char 22바이트인
"C++ is awesom, isn't?"
문자열을 기존 어딘가에 존재하는 메모리 영역에서 복사해와서,
"POPE" 문자열 뒤에 붙여넣으면 됩니다.
</aside>