Eat Study Love

먹고 공부하고 사랑하라

SW 만학도/C++

Review 5 - Special Members in C++

eatplaylove 2024. 7. 20. 11:00

https://eglife.tistory.com/88

 

Review 4 - Class,Overloading,Special Members in C++

https://eglife.tistory.com/87 Review 2 - Functions and Memory Management in C++https://eglife.tistory.com/85 Review 2 - Container, Iteration in C++https://eglife.tistory.com/83 Review 1 - Basic Standard Library in C++(Cin/out,file I/O, String)이번엔

eglife.tistory.com

요번 콘텐츠는 내용이 많지가 않다.

 

Copy 와 Move Semantic을 좀 집고 넘어갈 건데, 잘 정리해보겠다.

 

 

1. Copy Semantics

 

지난 Review 4에서 예로 들었던, SimpleVector Class를 가져와보자.

 

    SimpleVector<int> vec1 = {1,2,3};
    SimpleVector<int> vec2 = vec1;

    for(auto e : vec2){
        cout << e << " ";
    }
    cout << endl;
    for(auto e : vec1){
        cout << e << " ";
    }

 

이렇게 vec2를 vec1의 copy로 직접 만들려고 하면 Error가 뜬다. Deep Copy가 아니기 때문!

Deep copy를 해야 진짜 우리가 원하는 Value가 Copy가 되는 것인데,

 

이는 Copy Constructor를 써준다.

 

Initialize를 할 때, 기존에  있는 object를 참고해서 새로운 object를 만든다는 개념이다.

이런식으로 Constructor를 만들어 줄 때, 아예 Parameter로 특정 SimpleVector class의 object를 받게 하여 얘 값과 똑같은 New Object를 initialize하는 개념이다.

 

근데 우리가 보통 새로운 Object를 만들 때,

// 이렇겐 잘 안 함
SimpleVector<int> vec1 = {1,2,3};
SimpleVector<int> vec2(vec1);
// 보통 이렇게 함
SimpleVector<int> vec1 = {1,2,3};
SimpleVector<int> vec2 = vec1;

'같다' , '할당하다'라는 의미의 Operator인 '='를 많이 쓴다.

 

근데, SimpleVector Class에선 우리가 이 Operator를 따로 정의해 준 적이 없기떄문에,

 

지난 시간에 배웠던대로 이 녀석도 Operator Overloading이 필요하다.

기존 array는 어차피 이제 update되면 필요가 없으니까 delete 해주고, 우측 Operand와 똑같은 놈을 만들기 위해 새로운 array를 다시 할당 해준다. 

 

 

2. Move Semantics

 

Object를 째로 Copy하는 Deep Copy 기술은 사실 비싼 작업이다.

 

간단히 생각해봐도, copy하려는 array의 크기가 크다면 그거 일일히 for문 돌려서 그대로 복사하는 게 여간 쉬운일은 아닐 거라는게 딱 느껴진다.

 

그래서, copy하려는 operand가 더 이상 필요 없고, 새로운 object에 값만 옮긴 뒤 기존 놈을 삭제하는 방식을 고안해본 것이 Move Semantic이다.

 

즉 Copy가 아니라 Transfer 개념으로 접근!

 

이게 Move Constructor의 Template인데.. 솔직히 좀 조악하다. noexcept 부터 해서 인자를 Reference의 Reference를 받는 등.. 넘 구찮게 꼬아놨다.

여기서도 Move Operator Constructor를 이렇게 만들어 놓긴 하였는데,,

 

적당히 참고만 하자. 솔직히 개념정도만 이해하면 되지, 이걸 구현할 일은 있으려나 싶다.

 

골자는, Overloading Body 안에서 기존<->Source Object간 swallow copy가 일어나고 그 다음 source ojt를 삭제시켜주는 것이다.

 

 

 

Compiler는 최적화에 특화된 게,

Function call이 발생하면 그 function을 통해 만들어질 Object를 미리 만들어 놓는다.

 

이것을 Return Value Optimization 이라고 한다.

 

Copy와 Move Semantic의 비교는 아래와 같다.

 

 

 

3. Static Members

 

Class Object들을 통틀어 특정 value가 얼마나 나왔는지 Count하고 싶을 때, 쓰이는 Member이다.

 

 

static 이라는 키워드를 넣어 멤버변수를(method 형태) class내부에 만들어주고,

 

얘는 class 밖에서 초기화 해준다.

 

그리고 이제 Count하고 싶은 통계값이 있는 곳에 넣어준다.

 

여기 예제에서는 addElement에 넣어서, 특정 element가 얼마나 추가되었는지를 확인하는 Member 역할을 한다.

 

 

솔직히, 그렇게 중요한 내용은 아닌데

 

그래도 알고는 있어야 해서 공부했던 이번 회차의 내용이다.

 

이제 다음 콘텐츠로 Class 상속, 진정한 OOP가 시작되는데 사실상 그게 C++의 Main Point라고 해도 과언이 아니다.

 

- E. O. D -