전체 코드


📌 연산자 오버로딩이란?

연산자 오버로딩(Operator Overloading)은 클래스 타입의 객체가 일반 데이터 타입처럼 연산자를 사용할 수 있도록 만드는 기능입니다.

C++에서 기본적으로 지원하지 않는 사용자 정의 타입 간의 연산을 가능하게 합니다.


연산자와 함수의 차이점

연산자함수
피연산자 개수고정되어 있음자유롭게 설정 가능
사용 방식자연스러운 표현 가능 (a + b)명시적인 함수 호출 필요 (a.add(b))
사용자 정의일부 연산자는 오버로딩 불가능 (::, ., .*)자유롭게 정의 가능

연산자 오버로딩 방법

  1. 멤버 함수 방식

    • 왼쪽 피연산자가 반드시 클래스여야 합니다.
    • a + b 형태에서 a가 클래스인 경우에만 사용 가능.
    class Position {
    public:
        Position operator+(const Position& arg) { /* 연산 로직 */ }
    };
  2. 전역 함수 방식

    • a + b 형태에서 a가 클래스가 아니어도 사용 가능합니다.
    Position operator+(int a, const Position& b) { /* 연산 로직 */ }

연산자 오버로딩 코드 분석

#include <iostream>
using namespace std;

class Position {
public:
    // 두 Position 객체를 더하는 연산자
    Position operator+(const Position& arg) {
        Position pos;
        pos._x = _x + arg._x;
        pos._y = _y + arg._y;
        return pos;
    }

    // Position 객체와 정수를 더하는 연산자
    Position operator+(int arg) {
        Position pos;
        pos._x = _x + arg;
        pos._y = _y + arg;
        return pos;
    }

    // 두 Position 객체가 같은지 비교하는 연산자
    bool operator==(const Position& arg) {
        return _x == arg._x && _y == arg._y;
    }

    // 정수를 대입하는 연산자
    Position& operator=(int arg) {
        _x = arg;
        _y = arg;
        return *this;
    }

    // Position 객체를 대입하는 연산자 (복사 대입 연산자)
    Position& operator=(const Position& arg) {
        _x = arg._x;
        _y = arg._y;
        return *this;
    }

    // 전위 증가 연산자 (++pos)
    Position& operator++() {
        _x++;
        _y++;
        return *this;
    }

    // 후위 증가 연산자 (pos++)
    Position operator++(int) {
        Position ret = *this;
        _x++;
        _y++;
        return ret;
    }

public:
    int _x;
    int _y;
};

// 전역 함수 방식 (정수 + Position 객체)
Position operator+(int a, const Position& b) {
    Position ret;
    ret._x = b._x + a;
    ret._y = b._y + a;
    return ret;
}

int main() {
    Position pos1;
    pos1._x = 0;
    pos1._y = 0;

    Position pos2;
    pos2._x = 1;
    pos2._y = 1;

    // Position + Position
    Position pos3 = pos1 + pos2;  
    // Position + int
    Position pos4 = pos3 + 1;      
    // int + Position (전역 함수 사용)
    Position pos5 = 1 + pos3;      

    // 객체 비교 연산
    bool isSame = (pos3 == pos4);

    // 대입 연산자 테스트
    Position pos6;
    pos6 = 5;
    pos3 = pos6 = 5;

    // 전위, 후위 증가 연산자 테스트
    pos3++;
    ++pos3;
    ++(++pos3);

    pos6 = pos3++;

    return 0;
}

코드 분석 및 실행 흐름

  1. 연산자 오버로딩 적용 전

    Position pos3 = pos1 + pos2;  // 연산자 오버로딩 없으면 컴파일 오류 발생
    • 기본적으로 C++에서는 Position + Position 연산을 지원하지 않으므로 오류 발생.
  2. 멤버 연산자 함수 vs 전역 연산자 함수

    Position pos4 = pos3 + 1; // 멤버 함수
    Position pos5 = 1 + pos3; // 전역 함수
    • 멤버 함수로 정의된 operator+ (int)Position + int만 지원.
    • int + Position 형태를 지원하려면 전역 함수 방식으로 정의해야 함.
  3. 대입 연산자 (operator=)

    Position pos6;
    pos6 = 5;   // operator=(int) 호출
    pos3 = pos6 = 5; // 연속적인 대입 연산 가능
    • operator=(int)을 사용하면 pos6_x, _y 값이 5로 설정됨.
    • pos3 = pos6 = 5; 형태로 연속적인 대입 연산이 가능.
  4. 증감 연산자 (operator++)

    pos3++;
    ++pos3;
    ++(++pos3);
    pos6 = pos3++;
    • 전위 증가 연산자 (++pos): 값이 증가된 후 반환됨.
    • 후위 증가 연산자 (pos++): 현재 값을 저장한 후 증가된 값을 반환.
    • pos6 = pos3++; 수행 후, pos6에는 증가 전 값이 저장됨.

연산자 오버로딩의 필요성

1️⃣ 클래스 타입 간의 연산 지원

기본적으로 Position + Position 같은 연산을 수행할 수 없지만, 연산자 오버로딩을 사용하면 자연스럽게 연산을 수행할 수 있습니다.

2️⃣ 코드 가독성 향상

Position pos3 = pos1 + pos2;  // 연산자 오버로딩 사용
Position pos3 = pos1.add(pos2);  // 일반 함수 사용 (가독성이 떨어짐)
  • operator+를 사용하면 직관적인 코드 작성 가능.

3️⃣ 대입 연산자 활용

Position pos6;
pos6 = pos3 = 5; 
  • 자기 자신을 반환하는 대입 연산자(operator=)를 정의하면 연속적인 대입이 가능.

4️⃣ 전위 및 후위 연산자

++pos;
pos++;
  • 연산자 오버로딩을 사용하면 ++ 연산자를 직관적으로 사용할 수 있음.

profile
李家네_공부방

0개의 댓글