#TIL

C++의 Rule of Zero

한참 전에 업무에서 C++을 사용하던, 평생 C++을 쓸 것 같았던 그 시절 공부했던 기록을 찾아서 남겨본다.


Rule of Three, Rule of Five에 대해서 간단히 정리하자면...

Rule of Three는 소멸자, 복사 생성자, 복사 할당 연산자 중 하나를 정의했다면 다른 것도 같이 정의해야 한다는 것이다.
Rule of Five는 모던으로 넘어오면서 위의 3개에서 이동 생성자, 이동 할당 연산자를 추가 한 것이다.

단순히 무조건 기계적으로 만들어라라기 보다는, 저 중 하나를 만들었으면 다른 것에 대한 생각을 무조건 하고, 적절한 처리를 해야된다는 뜻이다.

(포인터를 멤버로 가지고 있고 소멸자에서 그 포인터를 할당 해제 하는 클래스가 있을 때, 복사 생성자를 정의 안하면 복사된 인트선스와 복사한 인스턴스 둘 다 같은 곳을 가르키고, 소멸될 때 같은 곳을 해제할려 할 테니 에러가 생긴다. 이런 문제가 있을 수 있다는 것)

Rule of Zero는 가능한 한 위의 것 중 하나를 선언하는 행동을 하지 마라라는 것이다.
위의것이랑 방향성이 다르다. 위는 꼭 해야 되는 것이고, 이것은 개선방식이다.

Rule Of Three/Five가 나온 이유는, 저 중 하나를 정의 할 일이 있기 때문이다. 주로 리소스 관리에서 많이 있다.
Rule of Zero에서는, 그런 리소스 관리를 전문 클래스에게 맏길 수 있다면, 즉, 굳이 소멸자 등의 기본 연산을 정의 안해도 된다면 맏기는 것이 좋다는 말이다.
OOP의 단일 책임 원칙에 따른 것인데, 리소스 관리는 잘 해주는 클래스를 사용하고 사용하는 쪽에서 복잡한 처리를 하지 말자는 뜻이다.
따라서, 당연히 그런 클래스의 내부 구현에서는 Rule of Three/Five를 따라야 할 것이다.
이러한 클래스에는 Vector, Map 등이 있다.

이 내용은 C++ Core Guideline 에도 나와있다. 링크

C.20: If you can avoid defining default operations, do.

이런것은 정의를 외우기보다는 왜 이런 말이 나왔는지를 파악하는 게 더 맞는 방법 같다. Rule of Zero는 클래스 설계 기법이라기보다는, 객체를 잘 쓰자는 말에 가까운 것 같다.