본문 바로가기

BE/C++

[C++] 연산자 오버로딩이란

인트로
안녕하세요. 오늘은 연산자 오버로딩 개념과 형태에 대해서 글을 써보겠습니다.

목차
1. 연산자 오버로딩의 개념
2. 형태
3. 코드

1. 연산자 오버로딩의 개념
연산자라는 것도 하나의 함수로 생각하여 이 함수를 오버로딩한다는 개념이다. 기존의 정의되어있는 데이터 타입을 우리가 만든 연산자에도 대해서 동작하게 하는 것이다.
즉, 연산자 오버로딩은 객체 지향 프로그래밍(OOP)에서 다른 연산자들이 함수 인자를 통해 구현되는 것을 말한다.
예를 들어, 덧셈 연산자는 정수가 들어올때도 동작하고, 실수가 들어올때도 동작하게 만들어져있다. 이러한 덧셈연산자를 우리가 정의한 데이터 타입에 대해서도 동작하게 하는것이 연산자 오버로딩 이다. 대부분의 연산자는 자식까지 상속이 된다.
결국, 내가 만든 데이터 타입이 이 연산자에 대하여 적용될 수 있도록 오버로딩하는 것이 연산자 오버로딩이다.

2. 연산자 오버로딩의 형태
operator op(argument-list)
ostream& operator<<(ostream& out, time& t) ,
또는 time operator*(int mult, time& t) 처럼 함수를 선언하고 작성한다. c의 객체에 t1 t2를 더한 값을 계산하여 대입하고 싶다면 이렇게 작성하면 된다.
c = t1.operator+(t2)
c의 객체에 10 t1를 더한 값을 계산하여 대입하고 싶다면 이렇게 작성하면 된다.
c = 10.operator+(t1)

연산자 오버로딩의 방법에는 2가지가 있다.
1. 전역 함수에 의한 연산자 오버로딩
전역함수에 의한 오버로딩이란, 내가 만든 타입(내 클래스 객체)이 연산자 뒤에 오는경우, 전역 함수로 정의 하고 , private멤버를 접근하는 경우 friend함수로 선언하는 것이다.

2. 클래스 내부 연산자 오버로딩
클래스 내부 연산자 오버로딩이란, 내가 만든 타입(내 클래스 객체)이 연산자 앞에 오는경우, 클래스 내부 연산자로 오버로딩하는 것이다.

 
다음은 연산자 오버로딩에 대한 예제 코드이다.  바로 아래의 코드는 main.cpp이다. 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

 #include <iostream>

 #include "time.h" 

 using namespace std;

 time operator*(int mult, time& t) 

 {

    time result;

    long totalminiutes = t.hours * mult * 60 + t.minutes*mult;

    result.minutes = totalminutes % 60

    result.hours = totalminutes / 60

    return result;

 }

 ostream& operator << (ostream& out, time& t)

 {

    out << t.hours << t.minutes << endl;

    return out;

 }

 int main()

 {

    time t1(2,50);

    time t2(3,10);

    time t3 = t1 + t2;

    time t4 = t1 * 2;

    time t5 = 2 * t4;

    t1 << cout//전역함수로 재정의 

    cout << t1;  // 클래수함수로 정의 

    cout << t1 << t2 << t3 << t4 << endl;

    return 0

 }

Colored by Color Scripter

cs


다음은 time.h 코드이다.

Time.h