[c++] 연산자 오버로딩 - 멤버 함수가 아닌 경우

파이톨치·2022년 4월 28일
0

대학수업

목록 보기
3/32
post-thumbnail

연산자 오버로딩의 소개

우리는 다양한 연산자를 사용합니다. 연산자의 종류는 + - * // 등 다양하게 존재합니다. 우리 인간은 1 + 1 혹은 x + 1과 같은 연산을 좋아합니다. 왜냐면 우리가 자주 쓰는 연산이기 때문입니다. 하지만 상황에 따라서는 + 1 1 혹은 + x 1 과 같은 연산을 하기도 합니다.

이것을 함수로 만든다고 하면 +(x, 7)과 같은 형태가 될 것 입니다. 이 함수는 x와 7의 합을 반환하는 함수입니다. 이런 식으로 우리의 상황에 맞는 + 연산을 하기 위해서 우리는 +를 연산자 오버로딩 합니다.

그렇다면 오버로딩이 뭘까요? 우선, 위키백과에서 정의하는 오버로딩을 살펴보겠습니다.

함수 오버로드(영어: Function overloading)는 다양한 에이다(Ada), C#, C++, 자바(Java) 등의 다양한 프로그래밍 언어에서 사용되는 함수의 특징으로, 같은 함수 이름을 가지고 있으나 매개변수, 리턴타입 등의 특징은 다른 여러개의 서브프로그램 생성을 가능하게 한다. (C언어는 지원하지 않는다)

예로 Print(object O) 함수를 들 수 있다. 이 경우, 우리는 글자를 출력하거나 그림을 출력할 때 이 함수가 서로 다르게 기능하기를 원한다. 이를 다른 두 함수로 표현하기 위해서는 Print(text_object T); Print(image_object P)로 각자 오버로드 되어야한다. 우리가 출력하기를 원하는 모든 객체에 오버로드 된 print 함수(메소드)를 사용할 수 있다면 우리는 객체의 형식과 올바른 함수를 호출 하기 위해 걱정할 필요가 없이 Print(something)의 통일된 형태로 가능하게 된다.

print 함수를 예시로 든 것이 잘 이해가 되네요. 이미지를 출력하고 싶을 때 print를 이미지를 출력하게 끔 오버로딩을 하면 편하게 사용할 수 있습니다.

그렇다면 연산자 오버로딩은 뭘까요? 그저 연산자를 덮어 써서 내가 새로운 연산을 하겠다는 말 입니다. 기본적인 연산자의 경우에는 int나 float만 연산이 가능했습니다. 하지만 필요에 따라서 나는 char나 money (클래스 명) 과 같이 다양한 타입으로 연산을 진행하고 싶어하는 것 입니다. 때문에 이러한 연산자 오버로딩을 진행하는 것 입니다.

간단한 활용법

+ 연산자

const Monet operator + (const Money& amount1, const Money& amount2)
{	
int allCents1 = amount1.getCents() + amount1.getDollors() * 100;
	int allCents2 = amount2.getCents() + amount2.getDollors() * 100;
	int sumAllCents = allCents1 + allCents2;
    int avsAllCents = abs(sumAllCents);
    int finalDollars = absAllCents / 100;
    int finalCents = absAllCents % 100;
    
    if (sumAllCents < 0)
    {
    	finalDollars = -finalDollars;
        finalCents = - finalCents;
    }
    
    return Money(finalDollars, finalCents);
}

다음과 같이 사용합니다. 편의를 위해서 참조자를 사용해줍니다. 반환하는 값은 Money 클래스 일 것이고 이 연산자 오버로딩을 통해서 머니에 대해 연산이 가능해집니다. 추가적으로, 이 예시에서 +는 멤버 함수가 아니었습니다.

== 연산자

== 연산자도 한 번 보면 다음과 같이 생겼습니다.

bool operator ==(const Money& amount1, const Money& amount2)
{
	return ((amount1.getDollars() == amount2.getDollars() && (amount1.getCents() == amount2.getCents()));
}

맨 앞에 const는 왜 붙이는건데??

const는 왜 붙이는 걸까요? const를 붙이면 상수처럼 됩니다. 따라서 내가 const를 붙이는 순간 변경할 수 없습니다. 반대로 생각해서 non const를 붙이면 어떻게 될까요? 우리가 (money1+money2).output();를 했을 때는 별 문제가 없지만 (money1+money2).input();을 하면 모르는 객체에 대해 변경을 허용해서 문제가 생긴다고 합니다. 단순하게 생각해서 매소드에 const붙이는 거랑 비슷한 이유라고 보면 되려나? 사실 나도 잘 모르겠다...

단항(Unary) 연산자

우리가 앞에서 봤던 것들은 이항(Binary) 연산자이다. 지금 다룰 내용은 단항 연산자이다. 단항 연산자는 다음과 같이 코딩 한다.

const Money operator - (const Money& amount)
{
	return Money(-amount.getDollors(),-amount,getCents());
}

참 쉽죠? 참고로 reuturn anonymous object.

profile
안알랴줌

0개의 댓글