본문 바로가기
패스트캠퍼스 챌린지(C++ 올인원)

패스트캠퍼스 챌린지 21일차

by 승욱은 2021. 11. 21.

오늘은 드디어 산술자 오버로딩에 대해 배우는 날..! 사실 c++에서 이게 제일 신기했다. 맨 처음 보는 순간 와..! 하는 감탄사가 절로 나왔다. 항상 생각했던게 내가 다루는 '객체의 종류마다 연산자가 다른 역할을 하게 할 순 없을까..?' 라는 것이었다. 예를 들면 벡터의 덧셈이라던가 하는 것들 말이다. 그런데 c++에서는 그게 가능하다..! 적어도 자바나, 파이썬에서 보지는 못했는데 있는지 모르겠다.

 

사실 많이 봐왔던 cout << x << endl; 에서 <<나 >>가 가능했던 이유도 연산자가 오버로딩이 되었기 때문이었다. 원래대로라면 비트의 쉬프트 연산이었을 것이다. 

 

그래서 오늘은 실제로 이 오버로딩을 직접 해보았다. 벡터의 덧셈, 뺄셈, 나눗셈 등등을 구현해봤는데 다음과 같았다. 

 

두 종류의 객체 사이에서 +, - 등의 연산을 진행할 때, 컴파일 과정에서 v1.operator+(v2) 이런 식으로 바뀐다고 한다. 따라서 operator+ 함수를 객체에서 오버로딩하면 우리가 원하는 연산을 진행할 수 있는 것이다. 

 

class Vector
{
public:
    float x;
    float y;
    float z;

    Vector operator+() const
    {
        return *this;
    }

    Vector operator-() const
    {
        return Vector{-x, -y, -z};
    }

    Vector operator+(const Vector &v) const
    {
        return Vector{x + v.x, y + v.y, z + v.z};
    }

    Vector operator-(const Vector &v) const
    {
        return Vector{x - v.x, y - v.y, z - v.z};
    }

    float operator*(const Vector &v) const
    {
        return x * v.x + y * v.y + z * v.z;
    }

    Vector operator*(float a) const
    {
        return Vector{x * a, y * a, z * a};
    }

    Vector operator/(float a) const
    {
        return Vector{x / a, y / a, z / a};
    }

    Vector &operator++()
    {
        ++x;
        ++y;
        ++z;
        return *this;
    }
    Vector &operator--()
    {
        --x;
        --y;
        --z;
        return *this;
    }

    Vector &operator++(int)
    {
        Vector tmp = *this;
        ++(*this);
        return tmp;
    }
    Vector &operator--(int)
    {
        Vector tmp = *this;
        --(*this);
        return tmp;
    }

    void print() const
    {
        cout << "x : " << x << " y : " << y << " z : " << z << endl;
    }
};

 다만 vector가 const로 선언 되었을 경우, this 포인터가 넘어가는 것을 대비에 const를 붙여줘야하는데, 이 경우 후위연산자 ++, --나 전위 연산자 ++,--가 작동이 안된다. 다만 const로 안해도 작동이 잘 안되는 것 같은데.. 한 번 공부하고 검토를 해봐야겠다. 

 

 다만 이 연산자 오버로딩은 문제에서 사용하기는 어려울 것 같고, 나중에 혹시 게임 개발이나, 혹은 데이터 분석을 하는 경우에 다룰 수 있을 것 같다. 

 

연산자 오버로딩을 공부하는 모습

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

패스트캠퍼스 : https://bit.ly/3FVdhDa

 

수강료 100% 환급 챌린지 | 패스트캠퍼스

딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!

fastcampus.co.kr

 

#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #C++실력완성올인원패키지

댓글