언어 자료구조 알고리즘/Escort C++

[C++] 전역 연산자 중복 정의

언제나휴일 2016. 4. 15. 15:01
반응형

7.1.1 전역 연산자 중복 정의

 

 전역에서 연산자 중복 정의를 할 때에는 다음과 같은 포맷을 갖게 됩니다.

 

[리턴 형식] operator [연산기호] (피 연산자 리스트)

{

   [기능 구현]

}

 

 전역 연산자 중복 정의를 하는 간단한 예를 들어 보기로 할게요.

 

 학생 클래스에 기본 키 역할을 하는 번호 필드를 반환하는 메서드를 이용을 하는 것을 == 연산자를 사용할 수 있도록 만들어 보겠습니다.

 

Stu.h

#pragma once

#include <iostream>

#include <string>

using namespace std;

 

class Stu

{

    const int num;

    string name;

public:

    Stu(int _num,string _name);

    int GetNum()const;

};

 

bool operator == (int num, const Stu &stu);

 

 학생 클래스에는 이미 기본 키 역할을 하는 번호를 반환하는 메서드가 이미 구현되어 있으며 전역에 구현할 == 연산자 중복 정의에 필요한 시그니쳐를 선언을 추가하였습니다.

 

bool operator == (int num, const Stu &stu);

 

Stu.cpp

#include "Stu.h"

Stu::Stu(int _num,string _name):num(_num)

{

    name = _name;

}

int Stu::GetNum()const

{

    return num;

}

bool operator == (int num, const Stu &stu)

{

    return stu.GetNum() == num;

}

 

 소스 파일에서는 == 연산자 중복 정의 구현에서는 이미 구현이 되어 있는 Stu 클래스의 GetNum 메서드를 호출하여 비교한 결과를 반환하는 코드만 추가하면 되겠네요.

 

 이처럼 구현하면 사용하는 곳에서 int 형식과 Stu 형식을 피 연산자로 하는 == 연산자를 사용하면 중복 정의한 operator== 메서드가 호출이 됩니다. 주의하실 사항은 Stu * 형식은 사용자 정의 형식이 아니며 Stu 형식이 사용자 정의 형식이라는 것입니다. [그림 7.1]을 보시면 이 같은 경우에 컴파일 오류가 발생함을 알 수 있습니다.


연산자 중복 정의에서 주의할 사항

[그림 7.1]

 

Example.cpp

#include "Stu.h"

void Test(Stu *stu,int num);

void main()

{

    Stu *s = new Stu(3,"홍길동");

    Test(s,4);         Test(s,3);

}

void Test(Stu *stu,int num)

{

    if( num == (*stu) )

    {

        cout<<"일치함"<<endl;

    }

    else

    {

        cout<<"일치하지않음"<<endl;

    }

}

 

 이처럼 연산자 중복 정의를 하면 사용자로서는 좀 더 직관적으로 사용할 수 있게 됩니다. 하지만 컴파일러에서는 연산자 중복 정의를 구현한 코드의 논리가 해당 연산에 적절한지에 대한 논리적 부분은 검증하지 않기 때문에 이에 관한 책임은 개발자의 몫입니다. 그리고 사용자는 앞의 예와 같이 사용할 수 있다면 Stu 형식과 정수형 사이에도 == 연산자가 가능할 것이로 생각할 수 있지만 [그림 7.2]을 보면 가능하지 않음을 알 수 있습니다. 연산자 중복 정의를 할 때에는 사용할 개발자의 입장을 고려하여 신뢰성이 떨어지지 않게 구현하여야 합니다.


연산자 중복정의에서 주의할 사항

[그림 7.2]


7장 산자 의 Part1

7장 산자 의 Part2

(모든 동영상 강의는 무료입니다.)

반응형