본문 바로가기

study

C++ 연산자 오버로딩

■ 그럼 연산자 오버로딩 어케 하는데?

먼저 일반 멤버 함수로 만들어 보죠~


#include<iostream.h>


class Number{

        private:

                int num;

        public:

                Number(int data=0);

                void print();

                Number operator+(Number add_num); //연산자 오버로딩

};


Number::Number(int data)

{

        num=data;

}


void Number::print()

{

        cout<<num<<endl;

}


Number Number::operator +(Number add_num)

{

        Number re;


        re.num=this->num+add_num.num; //참고루 re.num=num+add_num.num 이것두 같은 결과~! 배웠죠?


        return re;

}


void main(void)

{

        Number a(10),b(20);

        Number result;

   

        result=a.operator +(b); //이건 result=a+b; 로 바꿀수 있다는 놀라운 사실!

        result.print();

}


보면 클래스에


class Number{

        private:

                int num;

        public:

                Number(int data=0);

                void print();

                Number operator+(Number add_num);

};


Number operator+(Number add_num);


흠 operator 하구 오버로딩할 부호 +를 붙여서 만들었네요~!

뭐 어렵게 생각할꺼 없이

operator+를 그냥 함수의 이름으로 생각해서 실제로 써보면

메인에서

result=a.operator+(b);

이렇게 썼네요.


“띠바! result=a.operator+(b); 랑 result=a.add(b); 랑 뭐가 틀려~!!”

“뭐야 이거 ‘아는 함수??’ 잖아! 이름만 틀린거잖아 우릴 바보루 아는게야?”


라고 하시는 분들 진정을~!


result=a.operator+(b); 는


result=a+b; 이렇게 쓸수 있다는 사실!!

실제로 바꾸어서 위의 예제 한 마리를 실행시키면 같은 결과를 얻는 것을 알수 있습니다.

완전 원츄하네요 그쵸?

이건 마치 일반 자료형 다루듯이 클래스를 다루니~!

허 참 좋은 세상이네요~


이번엔 friend 함수로 만들어 볼까요?

이번엔 뺄셈을 해봐요~!


#include<iostream.h>


class Number{

        private:

                int num;

        public:

                Number(int data=0);

                void print();

                friend Number operator-(Number first, Number second); //friend함수로 만든 뺄셈~

};


Number::Number(int data)

{

        num=data;

}


void Number::print()

{

        cout<<num<<endl;

}


Number operator-(Number first, Number second)

{

        Number re;


        re.num=first.num-second.num;


        return re;

}


void main(void)

{

        Number a(10),b(20);

        Number result;

   

        result=a-b; //result=operator-(a,b); 랑 같은것임~!

        result.print(); //결과 출력~!

}


이번엔 friend함수로 구현해 보았습니다.


result=operator-(a,b);이랑 result=a-b; 랑 같은것입니다~!

뭐 예제만 봐두 알겠지요~!


C++강의는 C강의에 비해 설명 없이 너무 예제 한 마리들만 내세워 강의하는게 아니냐는

불만 어린 목소리들도 있을수 있겠군요~!

뭐 그럼 다른강의 보시던가가 아니구~!

뭐 인생이 그런거 아니겠어요? 키둑~~!


암튼 C도 그렇지만 지금 C++강의까지 제 강의만 보시고 마스터하시려는 분께 당당히 외치고 싶네요~! 책보셈~!! 이라구~~ 제 강의 보구 가지고 계신 책으로 마무리 꼭 해야 효과가 나타나요~!


갑자기 삼천포로 퐁당 빠졌는데 다시 되돌아 오죠.

마이너스 기능을 한번 만들어 볼까요? 즉 음수를 만드는 거죠~!

음수를 만들려면 앞에다 - 부호를 붙이면 되었죠? 그것두 함 만들어 보아요~!

위의 예제에 덧 붙여서~

이건 friend함수 말구 그냥 일반 멤버 함수로 만들어 보죠~!

다음 예제 한 마리를 보죠~!


#include<iostream.h>


class Number{

        private:

                int num;

        public:

                Number(int data=0);

                void print();

                friend Number operator-(Number first, Number second);

                Number operator-();   //이부분~!

};


Number::Number(int data)

{

        num=data;

}


void Number::print()

{

        cout<<num<<endl;

}


Number operator-(Number first, Number second)

{

        Number re;


        re.num=first.num-second.num;


        return re;

}


Number Number::operator -()

{

        Number re;


        re.num=-this->num; //혹은 re.num=-num;


        return re;

}


void main(void)

{

        Number a(10),b(20);

        Number result;

       

        result=-a-b; //result=operator-(a.operator-(),b); 이거랑 같음

        result.print();


        result=-(a-b); //result=operator-(a,b);  result=result.operator-(); 이거랑 같음

        result.print();


        result=-result;

        result.print();

}


자 실행 시키면


-30

10

-10


이 나옵니다. 왜 이렇게 나온지는 순전히 수학적으로 생각했을때

중학교때 뻘짓거리만 안했으면 다 이해하실꺼라 생각합니다~!

그렇쵸?

이 예제에서 이슈가 되는 두 함수를 살펴 볼까요


1번: friend Number operator-(Number first, Number second);

2번: Number operator-();


일단 friend함수로 구현된 1번 함수의 인자는 두 개입니다. 뭐 거기에 중점을 두는건 아니고 a-b 할때 - 앞뒤에 항이 두개 있으니깐 이것을 이항 연산자라고도 부른답니다.


2번 함수의 경우는 어떤가요 -b 이런식의 항이 하나밖에 없죠? 이걸 단항연산자라고도 부릅니다.


++a 같은 경우 단항 연산자이지만 풀어쓰면 a=a+1이므로 이항 연산자로 변신하는것두 참고로 알아두세요.


오 암튼 암튼~!


-a-b 하구 -(a-b) 이런 복잡한 계산을 똑똑한 컴터는 앞뒤의 항을 보아서

단항이면 2번 함수를 이항이면 1번 함수를 적절히 사용해 원하는 결과를 얻게 해준답니다.

똑똑히 구분하여 원할한 프로그램이 되는 것이지요~~


쫌 자세히 비집고 파고든다면

각 num의 값은 a는 10 b는 20입니다.

result=-a-b; 를 풀어쓴다면


result=operator-(a.operator-(),b);


이렇게 한줄로 풀어쓸수 있겠죠? 2번 함수를 사용해 a.operator-()를 계산한후(그럼 a는 현재 -10) 그 값과 b를 가지고 1번 함수를 사용해 결과(-10에서 20을 빼면 -30)를 만듭니다. 잘 살펴 보셈


이번엔

result=-(a-b);를 풀어쓴다면


result=operator-(a,b);

result=result.operator-();


이렇게 두줄로 풀어쓸수 있습니다. 1번 함수를 사용해 a에서 b를 뺀다음 그 결과(10에서 20을빼면 -10)를 구하고

그 결과를 2번 함수를 사용해서 결과(-10이 10으로 바뀌겠죠?)를 만드는 것이지요~!


마지막

result=-result;

뭐 설명할껏두 없죠?


지금까지 내용 이해 안가심 질문 주셈~!


“아~ 머리가 쫌 아파올려 그래~”


라고 하시는분 존재하실까봐 그만하죠~!


C++의 특성중의 하나인 다형성은 이 오버로딩 개념에 의해 아주 돋보이는 것이랍니당

그 중 연산자 오버로딩은 꽃이라 할수 있겠네요~!


 - http://cafe.naver.com/hackernara -


사용자 삽입 이미지