연산자 오버로딩은 사용자 정의 클래스에 대해 표준 연산자(예: +, -, *, ==)의 사용자 정의 동작을 정의할 수 있는 기능입니다. 이는 사용자 정의 유형(예: 벡터, 행렬)과 함께 작업할 때 표현력 있고 읽기 쉬운 코드를 작성하는 데 도움을 줍니다.
연산자 오버로딩 메커니즘은 C++에서 객체 작업 시 직관적인 문법을 지원하기 위해 도입되었습니다(예: 복소수의 더하기, 이터레이터 작업 등). 이는 기본 유형과 동일하게 작동합니다.
연산자 오버로딩이 없으면 많은 작업이 일반 함수(add(a, b))처럼 보이게 되며, 이는 코드 읽기를 복잡하게 하고 표현력을 저하시킵니다. 그러나 과도하거나 잘못된 사용은 혼란과 오류를 초래합니다.
C++에서는 대부분의 연산자를 오버로드할 수 있으며, 관련 멤버 함수나 친구 함수를 선언하여 새로운 작업의 로직을 지정할 수 있습니다.
코드 예시:
class Vector2D { double x, y; public: Vector2D(double x, double y) : x(x), y(y) {} Vector2D operator+(const Vector2D& rhs) const { return Vector2D(x + rhs.x, y + rhs.y); } };
주요 특징:
. (점) 및 :: (콜론) 연산자를 오버로드할 수 있나요?
아니요, . (점), ::, sizeof, ?: 및 기타 몇 가지와 같은 연산자는 언어 표준에 따라 오버로드할 수 없습니다.
오버로드된 연산자의 동작이 표준 의미와 완전히 일치해야 하나요?
그럴 필요는 없지만 권장됩니다(예: ==를 오버로드할 때 동등성 비교를 수행하는 것이 좋습니다).
오버로드된 연산자에 객체를 값으로 잘못 전달할 경우 어떤 일이 발생합니까?
여분의 복사본 또는 역참조가 발생할 수 있으며, 이는 프로그램을 느리게 하거나 오류를 초래할 수 있습니다. 상수 참조(const T&)를 전달하는 것이 좋습니다.
코드 예시:
Vector2D operator+(Vector2D rhs) const; // 비효율적, 객체가 복사됨
DataFrame 클래스에서 부작용(객체 수정)을 위해 스칼라 곱을 위해 * 연산자를 오버로드했습니다.
장점:
단점:
복소수 클래스에서 +, -, == 연산자를 일반적인 수학적 논리에 따라 오버로드하고 원본 객체를 수정하지 않았습니다.
장점:
단점: