연산자 오버로딩 Operator Overloading

Gogi·2023년 6월 8일

C++언어 기초 목록

목록 보기
14/15

뭐든 연산할 수 있도록 정의

연산자의 동작을 추가 정의하는 기능을 말한다. 사용자 정의 자료형처럼 서로 호환되지 않아 연산이 불가능한 자료형에 대해 연산이 가능하도록 만든다.


개념 설명

사용자 정의 자료형에는 다양한 자료형 혹은 연산을 지원하지 않는 자료형이 섞여있어서 연산을 할 수 없을 경우(산술 연산자, 입출력 연산자, 비교 연산자 등) 해당 연산자를 사용할 때 오버로딩된 연산자를 호출하여 연산을 수행할 수 있다.

1. 산술 연산자

+ - * / % 연산자를 오버로드하여 클래스에서 산술 연산을 지원할 수 있다. 보통 멤버 함수로 구현해 사용하지만 때에 따라 전역 함수 형태로 사용한다.

2. 비교 연산자

== != < > <= >= 연산자를 오버로드하여 클래스에서 비교 연산을 지원할 수 있다. 보통 멤버 함수로 구현해 사용하지만 때에 따라 전역 함수 형태로 사용한다.

3. 할당 연산자

= 연산자를 오버로드하여 사용자 정의 클래스의 객체간의 할당을 지원할 수 있다. 할당 연산자는 멤버 함수 형태로만 오버로딩이 가능하다.

4. 단항 연산자

++ -- - ! 등의 연산자를 오버로드하여 클래스에서 단항 연산을 지원할 수 있다. 보통 멤버 함수로 오버로딩하여 사용한다.

5. 입출력 연산자

<< >> 연산자를 오버로드하여 클래스에서 사용자 정의 자료형 입출력이 필요할 때 사용한다. 이들은 전역 함수로 오버로딩되는 것이 일반적이다.

6. 배열 인덱스 연산자

[] 연산자를 오버로드하여 클래스를 배열처럼 동작하게 만들 수 있다. 배열 인덱스 연산자는 멤버 함수로만 오버로딩될 수 있다.

7. 함수 호출 연산자

() 연산자를 오버로드하여 클래스에서 함수 호출과 유사한 동작을 지원할 수 있다. 이 연산자는 멤버 함수로만 오버로딩될 수 있다.

8. 포인터 연산자

-> 연산자를 오버로드하여 클래스에서 포인터와 유사한 동작을 지원할 수 있다. 이 연산자는 멤버 함수로만 오버로딩될 수 있다.


사용 예시

연산자 오버로딩은 주로 멤버 함수나 전역 함수(friend 선언) 형태로 선언, 정의된다. 보통 멤버 함수 형태로 오버로딩이 불가능할 때 전역 함수로 구현한다.

복소수 연산 예시

class Complex 
{
private:
    double real, imag;
public:
    Complex(double r = 0.0, double i = 0.0)
    : real(r), imag(i) {}
    Complex operator+(const Complex& rhs) const 
    {
        return Complex(real + rhs.real, imag + rhs.imag);
    }
};
int main()
{
	Complex a(1.0, 2.0);
	Complex b(2.0, 3.0);
	Complex result = a + b;
}

주의사항

  • 기존에 있는 연산자만 오버로딩할 수 있음.
  • 연산자의 우선순위, 결합방향을 바꿔선 안 됨.
  • 부적절하게 사용되면 코드를 복잡하고 혼란스럽게 만들 수 있음.
  • 해당 연산자의 기대치와 다른 결과가 나와선 안 됨.
  • 연산자 오버로딩이 불가능한 연산자 목록

업데이트

. . .

profile
C, C++, C#, Unity

0개의 댓글