Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++의 3의 법칙(Rule of Three)이란 무엇일까?

C++의 3의 법칙(Rule of Three)이란?

3의 법칙은 C++ 프로그래밍에서 널리 통용되는 경험 법칙(rule of thumb)이자 좋은 코딩 습관을 담은 원칙입니다. 이 법칙에 따르면, 클래스에서 다음 세 가지 중 하나라도 명시적으로 정의해야 한다면, 나머지 두 가지도 함께 정의하는 것이 바람직합니다.

  • 복사 생성자(copy constructor)
  • 복사 대입 연산자(copy assignment operator)
  • 소멸자(destructor)

왜 세 가지가 모두 필요할까?

그 이유는 간단합니다. 이 세 가지 중 하나라도 직접 정의해야 하는 상황이라면, 해당 클래스는 동적으로 할당된 자원(힙 메모리, 파일 핸들, 소켓 등)을 스스로 관리하고 있을 가능성이 매우 높기 때문입니다.

예를 들어 복사 대입 연산자가 필요한 경우를 생각해 보겠습니다. 객체를 값(value)으로 복사하려면 새로운 메모리 공간을 할당해야 하고, 이때 복사된 자원을 안전하게 처리하기 위해 복사 생성자가 필요합니다. 또한 객체의 수명이 끝날 때 할당된 자원을 해제하지 않으면 메모리 누수가 발생하므로 소멸자도 반드시 필요합니다. 즉, 세 가지는 서로 분리될 수 없는 하나의 자원 관리 체계를 이루는 것입니다.

참고: 5의 법칙과 0의 법칙

C++11부터 이동 생성자와 이동 대입 연산자가 도입되면서 이 원칙은 5의 법칙(Rule of Five)으로 확장되었습니다. 반대로 스마트 포인터(std::unique_ptr, std::shared_ptr)나 STL 컨테이너처럼 RAII 기반 타입에 자원 관리를 위임하면 특별한 멤버 함수를 직접 작성할 필요가 없는데, 이를 0의 법칙(Rule of Zero)이라고 부릅니다. 현대 C++에서는 가능한 한 0의 법칙을 지향하는 것이 가장 안전하고 유지보수에 유리한 방식으로 권장됩니다.