Programming/C C++
다음 Program은 Class로 부터 생성된 Object에 값을 설정하고 그 값을 확인합니다.

#include <iostream.h>

class calc{
  private:
    int num;
  public:
    void num_input(int i);
    int clacprnt();
};

void calc::num_input(int i)
{
  num = i;
}

int calc::clacprnt()
{
  return num;
}

main()
{
  calc in_num1, in_num2;
 
  in_num1.num_input(100);
  in_num2.num_input(200);
 
  cout << "in_num1 현재값 : " << in_num1.clacprnt() << endl;
  cout << "in_num2 현재값 : " << in_num2.clacprnt() << endl;
 
  return 0;
}


calc라는 Class에서 in_num1과 in_num2라는 Object를 생성합니다.


해당 Object에 값을 설정하고 설정한 값을 확인합니다.

이때 만일 in_num1 Object의 num member값과 in_num2 Object의 num member값 간에 어떠한 계산을 수행하려면 일반적인 수식구현과 동일하게 적용합니다.

#include <iostream.h>

class calc{
  private:
    int num;
  public:
    void num_input(int i);
    int clacprnt();
};

void calc::num_input(int i)
{
  num = i;
}

int calc::clacprnt()
{
  return num;
}

main()
{
  calc in_num1, in_num2;
 
  in_num1.num_input(100);
  in_num2.num_input(200);
 
  cout << "두수의 합 : " << (in_num1.clacprnt() + in_num2.clacprnt()) << endl;
 
  return 0;
}


(in_num1.clacprnt() + in_num2.clacprnt()) 구문으로 각 Object간 값을 더하고 있습니다.


위 program의 경우 각 Object간에 return되어 오는(calcprnt함수)값으로 연산을 수행하기 때문에 별 문제는 되지 않습니다.

하지만 값이 아닌 Object로의 연산은 어떻게 될까요?

main()
{
  calc in_num1, in_num2;
 
  in_num1.num_input(100);
  in_num2.num_input(200);
 
  cout << "두수의 합 : " << in_num1 + in_num2 << endl;
 
  return 0;
}

Program의 의도는 각 Object에 있는 num변수의 연산을 수행하는 것입니다. 그러나 Object는 말 그대로 Object일뿐 어떠한 '값'이 아니기 때문에 Object자체에 연산을 적용시키는것은 불가능합니다.

하지만 Class에서 Operator함수를 정의하면 위의 경우처럼 연산하는 것이 가능해집니다.

#include <iostream.h>

class calc{
  private:
    int num;
  public:
    void num_input(int i);
    int clacprnt();
    int operator + (calc num2);
};

void calc::num_input(int i)
{
  num = i;
}

int calc::clacprnt()
{
  return num;
}

int calc::operator + (calc num2)
{
  return (num + num2.num);
}

main()
{
  calc in_num1, in_num2;
  int i;
  in_num1.num_input(100);
  in_num2.num_input(200);
 
  i = (in_num1 + in_num2);
 
  cout << "두수의 합 : " << i << endl;
 
  return 0;
}


clac Class에 operator+ 함수를 정의하고 Class로부터 생성된 main함수에 +연산을 수행하였습니다.

operator+ 함수는 '만일 Class에 + 연산이 발생하면 어떻게 처리해야 하는가?'를 정의한 것이라고 보시면 되겠습니다. 따라서 Object끼리의 + 연산을 수행하면

int calc::operator + (calc num2)
{
  return (num + num2.num);
}

으로 처리가 진행되어 각 Object의 합이 출력되는 것입니다.

이때 operator+ 에서 인수로 calc형의 num2인수를 받도록 하였습니다. 이는 실제 연산을 수행하는데 in_num1과 in_num2의 피연산자가 필요하지만 operator+함수를 in_num1 Object의 member로 판단하기 때문에 다시 in_num1의 Object자체를 전달해 줄 필요는 없기 때문입니다.(operator+함수안에서 num member변수(in_num1 object의)에 접근하고 있습니다.)

따라서 인수로는 in_num2 object만으로 충분한 것입니다.

위의 operator함수에서는 인수로 calc형의 Object를 전달받도록 하였지만 필요하다면 다른 Data형을 지정하여 연산을 수행할 수 도 있습니다.

#include <iostream.h>

class calc{
  private:
    int num;
  public:
    void num_input(int i);
    int clacprnt();
    int operator + (int i);
};

void calc::num_input(int i)
{
  num = i;
}

int calc::clacprnt()
{
  return num;
}

int calc::operator + (int i)
{
  return (num + i);
}

main()
{
  calc in_num1, in_num2;
  int i;
  in_num1.num_input(100);
  in_num2.num_input(200);
 
  i = (in_num1 + 99);
 
  cout << "두수의 합 : " << i << endl;
 
  return 0;
}


operator함수의 인수로 int형 i를 받도록 하였으나 operator+함수의 인수가 다르므로 기본 + 연산에서 calc의 Object를 피연산자로 지정해서는 안됩니다. 다음처럼 해당 형식에 맞는 인수를 건네줘야 하는 것입니다.

i = (in_num1 + 99);


Object끼리의 연산을 확실히 수행하고자 한다면 다음과 같은 형태의 처리도 할 수 있습니다.

main()
{
  calc in_num1, in_num2, in_num3;
  int i;
  in_num1.num_input(100);
  in_num2.num_input(200);
 
  in_num3 = (in_num1 + in_num2);
 
  cout << "두수의 합 : " << in_num3.num << endl;
 
  return 0;
}
▶in_num1 Object와 in_num2 Object의 연산을 수행하여 in_num3 object에 대입합니다.

위와같은 구현이 가능하기 위해서는 operator의 인수가 아닌 다른 형으로 return을 바꿔줘야 합니다.

#include <iostream.h>

class calc{
  private:
    int num;
  public:
    calc() {num = 0;};
    calc(int i);
   
    void num_input(int i);
    int clacprnt();
    calc operator + (calc num2);
};

calc::calc(int i)
{
  num = i;
}

void calc::num_input(int i)
{
  num = i;
}

int calc::clacprnt()
{
  return num;
}

calc calc::operator + (calc num2)
{
  return calc(num + num2.num);
}

main()
{
  calc in_num1, in_num2, in_num3;
  in_num1.num_input(100);
  in_num2.num_input(200);
 
  in_num3 = (in_num1 + in_num2);
  cout << "두수의 합 : " << in_num3.clacprnt() << endl;
 
  return 0;
}

▶operator+함수의 return형을 calc로 하고 Object끼리의 + 연산을 수행합니다.

우선 operator함수에서 Object를 생성할때 초기값을 지정을 위해 Class에서 다음 선언을 추가하고 정의하였습니다.

calc(int i);
calc::calc(int i){
  num = i;
}

이렇게 되면 operator+함수안에서 인수로 전달된 Object의 num끼리 덧셈을 수행함과 동시에 calc형의 또 다른 Object를 생성하여 해당 Object를 return할 수 있게 됩니다.(그 결과를 in_num3 object에 대입하고 있습니다.)


operator함수를 통해 연산자를 정의할때는 반드시 해당 연산자의 역활을 수행할 수 있도록 강제하지는 않습니다.

calc calc::operator + (calc num2)
{
  return calc(num - num2.num);
}

+ 연산을 정의하고 있지만 실제 수행하는것은 - 연산입니다.

위와 같이 operator함수를 정의하는 것은 문법적으로 아무런 문제가 되지 않습니다. Compile도 정상적으로 처리되며 결과도 정상적으로 출력됩니다.


그러나 이러한 방식은 Program유지관리에 아무런 도움이 되지 않으며 오히려 혼란만 초래할 뿐입니다. 따라서 operator함수를 작성할때에는 다소 신중을 기해야 합니다.

'Programming > C C++' 카테고리의 다른 글

[C, C++] 확장 문자열  (0) 2010.03.30
[C, C++] 표준 Library 함수 - 문자 변환 함수  (0) 2010.03.29
[C, C++] Object간의 연산과 Operator  (0) 2010.02.24
[C, C++] Microsoft C, C++ Compiler  (0) 2010.01.22
[C, C++] Class 상속  (0) 2010.01.13
[C, C++] 함수작성및 Data전달  (0) 2010.01.07
0 0