연산자 오버로딩이란?
오버로딩이란 기존 함수에 새로운 의미를 부여하거나, 파라미터를 추가하거나, 새로운 것을 만들어 낸다는 개념이다.
연산자 오버로딩은, 연산자도 하나의 함수처럼 생각하여 이를 오버로딩한다는 개념이다.
기존의 정의되어있는 데이터 타입을 우리가 만든 연산자에도 대해서 동작하게 하는 것이다.
즉, 연산자 오버로딩은 객체 지향 프로그래밍(OOP)에서 다른 연산자들이 함수 인자를 통해 구현되는 것을 말한다.
예를 들어, 덧셈 연산자는 정수가 들어올때도 동작하고, 실수가 들어올때도 동작하게 만들어져있다. 이러한 덧셈연산자를 우리가 정의한 데이터 타입에 대해서도 동작하게 하는것이 연산자 오버로딩 이다.
대부분의 연산자는 자식까지 상속이 된다.
결국, 기억해야 하는 것은 연산자 operator 는 그냥 함수 라는 것이다.
Time 클래스 정의를 통한 연산자 오버로딩 예시
사용자 정의 데이터 Time 클래스를 만들어 보자.
Time 클래스는 private 맴버로 시간과 분을 가지고 있고,
그것에 대한 함수로 시간과 분을 더하는 기능을 수행하고자 한다.
시간과 분의 체계가 다르니 각각 다른 연산을 수행해 주어야 하니 연산자 오버로딩이 필요하게 된다.
Time.h 에서 선언
#include <iostream>
#ifndef TIMEH
#define TIMEH
class Time
{
private:
int hours;
int mins;
public:
Time();
Time(int, int);
void addHours(int);
void addMins(int);
Time sum(Time&);
void show();
~Time();
};
#endif // !TIMEH
func.cpp 에서 내용 정의
#include "time.h"
Time::Time()
{
hours = mins = 0;
}
Time::Time(int h, int m)
{
hours = h;
mins = m;
}
void Time::addHours(int h)
{
hours += h;
};
void Time::addMins(int m)
{
mins += m;
hours += mins / 60;
mins %= 60;
};
Time Time::sum(Time& t)
{
Time sum;
sum.mins = mins + t.mins;
sum.hours = hours + t.hours;
sum.hours += sum.mins / 60;
sum.mins %= 60;
return sum;
};
void Time::show()
{
std::cout << "시간: " << hours << std::endl;
std::cout << "분: " << mins << std::endl;
};
Time::~Time()
{
}
설명
Time 클래스는 hours, mins 를 멤버변수로 가지고 있고,
퍼블릭 멤버 함수로
1) 아무런 매개변수를 주지 않았을 때의 컨스트럭터 Time()
2) 매개변수를 주었을 때의 Time
3) void addHours(int)
: 지시받은 시간 int h 를 원래 있던 시간 horus에 더해준다.
4) void addMins(int)
: 시간체계가 60분을 넘어가면 1시간으로 따지기 때문에,
호출한 객체의 mins에 파라미터 h를 더해서 저장,
hours 에 mims/60 을 더해서 저장한 후,
mins는 60의 나머지를 저장해 준다.
5) Time sum(Time&)
: 호출한 Time객체와 매개변수로 넣은 Time 객체를 더해서 새로운 Time객체 mins로 만들어 준다.
위와 마찬가지로 새 객체 Time sum의 mis와 hours 계산을 해 준다.
6) show()
: 호출한 객체의 hours, mins를 출력해 주는 기능
7) 디스트럭터 ~Time()
main.cpp 실제로 Time 객체 사용
#include <iostream>
#include "time.h"
using namespace std;
int main()
{
Time day1(1, 40);
Time day2(1, 40);
day1.show();
day2.show();
Time total;
total = day1.sum(day2);
total.show();
return 0;
};
Time day1 : 1시간 40분
Time day2: 2시간 30분
새로운 Time 오브젝트 total을 만들어서 day1 과 day2 를 더한 값을 대입하니 4시간 10분으로 제대로 출력되는 것 확인.
연산자 오버로딩
위에서 day1과 day2의 합을 저장하는 total의 경우, 흔히 쓰는 산술연산자로 직관적으로 사용하려면
total = day1 + day2 이렇게 정의가 되어야 한다.
위 코드는 지금 sum이라는 함수를 통해 이 역할을 수행하고 있다.
이 sum을 정의한 time 클래스에서 오버로딩된 덧셈+ 연산자를 사용하는 방법으로 변환해 보자.
time.h 에서 sum 선언 파트를
Time operator+(Time&);
func.cpp 에서 sum 정의 부분을
Time Time::operator+(Time& t)
{
Time sum;
sum.mins = mins + t.mins;
sum.hours = hours + t.hours;
sum.hours += sum.mins / 60;
sum.mins %= 60;
return sum;
};
즉, 간단하게 sum 이라는 함수의 이름을 operator+ 로 바꿔주면 된다.
operator(오버로딩하고 싶은 산술 연산자)
여기서는 operator+ 이렇게 바꿔주면 덧셈 연산자가 오버로딩된다.
메인함수에서 사용해 보자.
#include <iostream>
#include "time.h"
using namespace std;
int main()
{
Time day1(1, 40);
Time day2(1, 40);
day1.show();
day2.show();
Time total;
total = day1.operator+(day2);
Time total2;
total2 = day1 + day2;
total.show();
total2.show();
return 0;
};
이렇게 total = day.operator+(day2); 함수처럼 사용해도 되고
total = day1 + day2; 이렇게 연산자처럼 사용해도 된다.
함수의 이름을 operator+로 정의했기 때문에 Time 객체 내에서는 원래의 +가 가지는 산술 연산이 아니라
정의한 클래스에 맞게 변형되어서 정의되는 것이다.
따라서 day1 + day2 는 새로 정의한 operator+에 오버로딩 되어서 함수 내에 정의한 더하기의 과정대로 작업을 수행한다.
실제 실행해 보면 두 연산 모두 4시간 10분으로 정상적인 값이 출력되는 것을 확인할 수 있다.
참고로 + 뿐만이 아니라
+, -, *, % 모두 연산자 오버로딩 할 수 있다.
출처: https://www.youtube.com/watch?v=mS9755gF66w
출처: https://youtu.be/Xp4NmgjZvyI
'C++ 코딩 > C++ 기초개념' 카테고리의 다른 글
C++ 반복자 Iterator (0) | 2022.11.06 |
---|---|
STL 표준 템플릿 라이브러리 (Standard Template Library) (0) | 2022.04.01 |
<C++ 기초> 공용체 union (0) | 2021.03.18 |
<C++ 기초> 구조체 struct, 구조체 응용(*포인터 인수로 사용하기) (0) | 2021.02.24 |
<C++ 기초> 클래스 Class의 기본 - 맴버, 멤버함수, private, public, protect, 캡슐화 (1) | 2021.02.24 |
<C++ 기초> 식과 연산자, 연산자의 종류와 우선순위 (0) | 2021.02.23 |
<C++ 기초> 동적배열, sti vector, 멤버함수 (0) | 2021.02.18 |
<C++ 기초> typedef, 열거형 enum (0) | 2021.02.16 |