
https://github.com/POCU/COMP3200CodeSamples
<aside> 💡 목차
</aside>
사용법의 차이는 굉장히 단순하다
복사 생성자는 그냥 & 하나만 붙이고 (Const를 붙인다)
이동 생성자는 그냥 && 두 개 붙인다 (Const를 뺀다)
<aside> 💡 복사 생성자

그냥 기존 ‣ 하던것과 동일합니다
</aside>
<aside> 💡 이동 생성자

선언부
그게 바로 지금 볼 이동 생성자라는 거예요, 자 이동 생성자, 복사 생성자 2개 비교해 봐요 굉장히 비슷해요, 펭귄(&) 하나, 두 마리로 바꿔놨고요, const를 뺀 게 전부예요, const를 왜 뺐을까, 고민하면 알아요, 왜? 나는 너를 털어올 거니까 너는 상태가 바뀌어, 그래서 const를 뺄 수밖에 없어요, 그래서 이동 생성자 이 모양이다 기억하셔야 돼요

정의부
자 그럼 이거 구현 어떻게 하냐? 이거 이미 보고 계시는 분도 있을 것 같은데 자 잘 생각을 해봐요 우리가 mString이 포인터예요, 복사 안 할 거면 얕은 복사해도 돼요 그다음에 뭘 해줘야 된다? 얕은 복사 까지는 좋지만 그다음에 얘를, 원본을 nullptr로 바꿔줘야겠죠? 그래서 어쨌든 간에 이 초기화 리스트에서 해줄 수 있는 건 다 할 거예요 자 복사를 해와요, 그렇죠? mSize 복사해와요, 첫 번째는 주소를 복사해오죠? 두 번째는 int 값을 복사를 해와요 그래서 어쨌든 간에 메모리 재할당은 없어요, 자 복사해왔으면 그다음에 어떻게 하냐? 원본 다 털어줘야죠? 지워줘야죠? 원본 너 mString 지워주고 원본 너 mSize 이제 0이야 그럼 원본은 처음 개체 만들어진 것처럼 텅텅 빈 개체가 되는 거예요

사용부
이동 생성자, 그러면 이동 생성자 호출은 어떻게 하냐? 저희 이미 알고 있어요, 그렇죠? 이거가 lvalue예요, 그렇죠? 얘는 변수가 여기 가지고 있어요, 그럼 얘를 rvalue로 바꿔줘야 돼요 어떻게든, 그게 std::move() 해주는 거다, 그리고 이거 호출되고 나오는 순간 이 이동 생성자 제대로 만들어놨다면 그렇죠? 그러면 studentName 속은 아무것도 안 남아 있을 거다까지 알 수가 있죠?
</aside>
<aside> 💡 이동 생성자의 결과

자 다시 한번 봐야겠죠? 메모리에서 어떻게 변하냐 studentName 이게 처음 변수고요 "Lulu" 주소가 b38에 들어가 있어요, 그렇죠?

포인터 변수를 얕은 복사 후 원본 포인터 변수를 지워버리며, 얕은 복사여도, 값의 이동이 정상 작동한다
그리고 이제 이동 생성자 호출한 뒤에 어떻게 변하냐? 자 studentName부터 볼까요? studentName, String nullptr Size 0 됐죠? 그러면 아까 b38에 있던 "Lulu" 어디 갔냐? copiedName, 새로운 오브젝트에 b38 "Lulu" 얕은 복사를 한 거예요, 근데 얕은 복사가 아니라 얕은 복사한 뒤에 원본을 지워줘 버린 거예요, 그래서 복사가 아니라 뺏어온 거죠 그래서 이런 개념이 있기 때문에 메모리 재할당 같은 걸 막을 수가 있는 거죠
</aside>