Untitled

https://github.com/POCU/COMP3200CodeSamples

<aside> 💡 목차


</aside>

Untitled

복사 생성자 vs 이동 생성자

사용법의 차이는 굉장히 단순하다

복사 생성자는 그냥 & 하나만 붙이고 (Const를 붙인다)

이동 생성자는 그냥 && 두 개 붙인다 (Const를 뺀다)

→ 복사 생성자의 구현

<aside> 💡 복사 생성자

그냥 기존 ‣ 하던것과 동일합니다

그냥 기존 ‣ 하던것과 동일합니다

</aside>

→ 이동 생성자의 구현

<aside> 💡 이동 생성자

![선언부

그게 바로 지금 볼 이동 생성자라는 거예요, 자 이동 생성자, 복사 생성자 2개 비교해 봐요 굉장히 비슷해요, 펭귄(&) 하나, 두 마리로 바꿔놨고요, const를 뺀 게 전부예요, const를 왜 뺐을까, 고민하면 알아요, 왜? 나는 너를 털어올 거니까 너는 상태가 바뀌어, 그래서 const를 뺄 수밖에 없어요, 그래서 이동 생성자 이 모양이다 기억하셔야 돼요](https://prod-files-secure.s3.us-west-2.amazonaws.com/09ccd4d5-876c-4bba-bbdf-cc77a0a11257/c4d164f5-843f-4de1-8523-03e2b730e757/Untitled.png)

선언부

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

![정의부

자 그럼 이거 구현 어떻게 하냐? 이거 이미 보고 계시는 분도 있을 것 같은데 자 잘 생각을 해봐요 우리가 mString이 포인터예요, 복사 안 할 거면 얕은 복사해도 돼요 그다음에 뭘 해줘야 된다? 얕은 복사 까지는 좋지만 그다음에 얘를, 원본을 nullptr로 바꿔줘야겠죠? 그래서 어쨌든 간에 이 초기화 리스트에서 해줄 수 있는 건 다 할 거예요 자 복사를 해와요, 그렇죠? mSize 복사해와요, 첫 번째는 주소를 복사해오죠? 두 번째는 int 값을 복사를 해와요 그래서 어쨌든 간에 메모리 재할당은 없어요, 자 복사해왔으면 그다음에 어떻게 하냐? 원본 다 털어줘야죠? 지워줘야죠? 원본 너 mString 지워주고 원본 너 mSize 이제 0이야 그럼 원본은 처음 개체 만들어진 것처럼 텅텅 빈 개체가 되는 거예요](https://prod-files-secure.s3.us-west-2.amazonaws.com/09ccd4d5-876c-4bba-bbdf-cc77a0a11257/e60ad698-1023-4a0b-84a9-d98b4db52233/Untitled.png)

정의부

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

![사용부

이동 생성자, 그러면 이동 생성자 호출은 어떻게 하냐? 저희 이미 알고 있어요, 그렇죠? 이거가 lvalue예요, 그렇죠? 얘는 변수가 여기 가지고 있어요, 그럼 얘를 rvalue로 바꿔줘야 돼요 어떻게든, 그게 std::move() 해주는 거다, 그리고 이거 호출되고 나오는 순간 이 이동 생성자 제대로 만들어놨다면 그렇죠? 그러면 studentName 속은 아무것도 안 남아 있을 거다까지 알 수가 있죠?](https://prod-files-secure.s3.us-west-2.amazonaws.com/09ccd4d5-876c-4bba-bbdf-cc77a0a11257/a9eb0c4d-e9d3-469f-9152-5efb5c05a45e/Untitled.png)

사용부

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

</aside>

→ 이동 생성자의 결과

<aside> 💡 이동 생성자의 결과

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

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

![포인터 변수를 얕은 복사 후 원본 포인터 변수를 지워버리며, 얕은 복사여도, 값의 이동이 정상 작동한다

그리고 이제 이동 생성자 호출한 뒤에 어떻게 변하냐? 자 studentName부터 볼까요? studentName, String nullptr Size 0 됐죠? 그러면 아까 b38에 있던 "Lulu" 어디 갔냐? copiedName, 새로운 오브젝트에 b38 "Lulu" 얕은 복사를 한 거예요, 근데 얕은 복사가 아니라 얕은 복사한 뒤에 원본을 지워줘 버린 거예요, 그래서 복사가 아니라 뺏어온 거죠 그래서 이런 개념이 있기 때문에 메모리 재할당 같은 걸 막을 수가 있는 거죠](https://prod-files-secure.s3.us-west-2.amazonaws.com/09ccd4d5-876c-4bba-bbdf-cc77a0a11257/938d07b2-09a1-470e-aa00-7a8faa8d08a1/Untitled.png)

포인터 변수를 얕은 복사 후 원본 포인터 변수를 지워버리며, 얕은 복사여도, 값의 이동이 정상 작동한다

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

</aside>