C/C++ 학습 · 6 min read · Oct 12, 2025

C/C++ 단계별 학습 - 페이지 15

15. 단계별 C/C++ — C++ 프로그래밍 - 연산자 오버로딩

연산자 오버로딩

| | 1. 소개

  1. 연산자
    • 연산자 오버로딩 규칙
    • 연산자 오버로딩의 제한
  2. 단항 연산자 오버로딩
  3. 이항 연산자 오버로딩
  4. 문자열과 함께하는 연산자 오버로딩 |

1. 소개

| | // 변수를 다른 변수에 할당
#include
using namespace std;
int main()
{
int a = 10, b;
b = a; // 유효
cout << b;
return 0;
} | // 객체를 다른 객체에 할당
#include
using namespace std;
class emp
{
public:
int eno;
float sal;
};
int main()
{
emp e1= { 1001, 2300.45 },e2 ;
cout << endl << e1.eno << e1.sal;
e2 = e1; // 유효
cout << endl << e2.eno << e2.sal;
return 0;
} |

표현식은 모든 언어에서 공통적이며, 표현식은 피연산자와 연산자의 집합입니다. 반면, 연산은 표현식의 집합입니다.
위의 두 프로그램은 변수/객체가 어떻게 함께 할당되었는지를 보여줍니다.

두 프로그램 모두 유효하며, 등호( = ) 연산자의 사용을 보여줍니다.

| | | |

연산자 오버로딩은 객체 지향 프로그래밍의 가장 흥미로운 기능 중 하나입니다. 이는 위의 불법 구조 작업과 같은 상황을 극복하는 데 사용됩니다. 복잡하고 모호한 프로그램 목록을 직관적으로 명확한 목록으로 변환할 수 있습니다.

연산자 오버로딩을 통해 일반 C++ 연산자가 사용자 정의 데이터 유형에 적용될 때 새로운 의미를 가질 수 있는 방법을 볼 수 있습니다. 연산자를 오버로딩하기 위해 사용되는 키워드는 operator이며, 결과 연산자는 프로그래머가 제공한 의미를 채택합니다.

예를 들어, 객체를 사용하여 문자열 직접 할당 작업을 수행할 수 있습니다.

| | // 문자열을 다른 문자열에 할당하는 프로그램
#include
#include
#include
using namespace std;
class string
{
char str;
public:
string() { }
string(char
s) { str = s; }
void putstring()
{
cout << str;
}
};
int main()
{
string s1(“Computer”);
string s2;
s2 = s1;
s2.putstring();
return 0;
} |

2. 연산자

type operator operator-symbol ( parameter-list )

operator 키워드는 클래스의 인스턴스에 적용될 때 operator-symbol이 의미하는 바를 지정하는 함수를 선언합니다. 이는 연산자에 여러 의미를 부여하거나 “오버로딩”합니다. 컴파일러는 피연산자의 유형을 검사하여 연산자의 다양한 의미를 구분합니다.

연산자 오버로딩 규칙

  • 다음 연산자를 오버로딩할 수 있습니다:
+-*/%^
!=<>+=–=

| | ^= | &= | |= | << | >> | <<= | | | <= | >= | && | || | ++ | –– | | | ( ) | [ ] | new | delete | & | | | | | ~ | = | /= | %= | >>= | == | | | != | , | –> | –> | | |

  • 연산자가 단항 연산자 또는 이항 연산자로 사용될 수 있는 경우, 각 사용을 별도로 오버로딩할 수 있습니다.

  • 연산자는 비정적 멤버 함수 또는 클래스의 친구인 전역 함수를 사용하여 오버로딩할 수 있습니다. 전역 함수는 클래스 유형 또는 클래스 유형에 대한 참조인 최소한 하나의 매개변수를 가져야 합니다.

  • 단항 연산자가 멤버 함수를 사용하여 오버로딩되는 경우, 인수를 받지 않습니다. 전역 함수를 사용하여 오버로딩되는 경우, 하나의 인수를 받습니다.

이항 연산자가 멤버 함수를 사용하여 오버로딩되는 경우, 하나의 인수를 받습니다. 전역 함수를 사용하여 오버로딩되는 경우, 두 개의 인수를 받습니다.

연산자 오버로딩의 제한

  • 새로운 연산자를 정의할 수 없습니다, 예를 들어 **.

  • 연산자의 우선순위나 그룹을 변경할 수 없으며, 수용하는 피연산자의 수를 변경할 수 없습니다.

  • 내장 데이터 유형에 적용될 때 연산자의 의미를 재정의할 수 없습니다.

  • 오버로딩된 연산자는 기본 인수를 가질 수 없습니다.

  • 어떤 전처리기 기호도 오버로딩할 수 없으며, 다음 연산자는 오버로딩할 수 없습니다:

| | . | .* | :: | ?: |

대입 연산자는 몇 가지 추가 제한이 있습니다. 비정적 멤버 함수로만 오버로딩할 수 있으며, 친구 함수로는 오버로딩할 수 없습니다. 이는 상속할 수 없는 유일한 연산자이며, 파생 클래스는 기본 클래스의 대입 연산자를 사용할 수 없습니다.

3. 단항 연산자 오버로딩

단항 연산자를 오버로딩하는 것으로 시작해 보겠습니다. 단항 연산자는 하나의 피연산자에만 작용합니다. (피연산자는 단순히 연산자에 의해 작용되는 변수입니다). 단항 연산자의 예로는 증가 및 감소 연산자 ++, 그리고 단항 마이너스가 있습니다.

예제:
다음 예제는 증가 연산자 ++의 사용을 보여줍니다.

| | #include
using namespace std;
class counter
{
private:
unsigned int count;
public:
counter(){ count = 0; }
int get_count()  { return count; }
counter operator ++()
{
count++;
counter temp;
temp.count = count;
return temp;
}
};
int main()
{
counter c1, c2;                            // c1 = 0,  c2 = 0
cout << “\nC1 = “ << c1.get_count();       // 표시
cout << “\nC2 = “ << c2.get_count();

++c1; // c1 = 1
c2 = ++c1 ; // c1 = 2, c2 = 2

cout << “\nC1 = “ << c1.get_count();       // 다시 표시
cout << “\nC2 = “ << c2++.get_count();     // c2 = 3
return 0;
} |

단항 마이너스를 오버로딩하는 또 다른 예제입니다.

| | #include
using namespace std;
class subtract
{
int a;
int b;
public:
void getdata(int x, int y)
{
a = x; b = y;
}
void putdata()
{
cout<< endl << “A = “ << a <<”B = “ << b;
}
void operator -()
{
a = -a; b = -b;
}
};

int main()
{
subtract s;
s.getdata(34, -6);
cout << endl << “S : “;
s.putdata();
-s;
cout << endl << “S : “;
s.putdata();
return 0;
}
|

4. 이항 연산자 오버로딩

그러나 연산자는 단항 연산자만큼 쉽게 오버로딩할 수 있습니다. 우리는 산술 연산자, 비교 연산자 및 산술 대입 연산자를 오버로딩하는 예제를 살펴보겠습니다.

우리는 단항 연산자를 오버로딩하는 방법을 방금 보았습니다. 동일한 메커니즘을 사용하여 이항 연산자를 오버로딩할 수 있습니다.

| | // + 연산자 오버로딩
#include
using namespace std;
class time
{
int hh; int mm; int ss;
public:
time( ) { }
time(int h, int m, int s)
{
hh =h; mm = m; ss = s;
}
void disp_time()
{
cout << endl << hh<< “ : “
<< mm << “ : “ << ss;
}
time operator+(time);
};

time time::operator+(time t)
{
time temp;
temp.hh = hh + t.hh;
temp.mm = mm + t.mm;
temp.ss = ss + t.ss;
return temp;
}

int main()
{
time t1(12,1,24) , t2(5, 23, 45), t3;
t3 = t1 + t2;
t3.disp_time();
return 0;
} |

5. 문자열과 함께하는 연산자 오버로딩

C/C++는 문자열을 매우 다르게 처리합니다. 우리는 다른 언어처럼 연산자를 사용하여 문자열을 복사, 연결 또는 비교하지 않습니다. C/C++는 위의 작업을 수행하기 위해 내장된 함수를 가지고 있습니다. 그러나 C++는 연산자를 사용하여 문자열에 대해 모든 작업을 수행할 수 있는 기능을 제공합니다. 즉, 우리는 이러한 작업을 수행하기 위해 연산자에게 추가 책임을 부여해야 합니다.

다음 예제는 비교 연산자 ==를 사용하여 두 문자열 간의 비교를 보여줍니다.

| | // 연산자 오버로딩을 사용하여 두 문자열 비교하는 프로그램
#include
#include
#include
using namespace std;

enum boolean{ false, true };

class string
{
char str;
public:
string() {
str = NULL; }
string(char *s) { str = s; }
int operator ==(string ts)
{
if (strcmp(str, ts.str) >= 0)
return true;
else
return false;
}
};

int main()
{
string s1(“Computer”);
string s2(“Computers”);

if(s1 == s2)
cout << “Equal”;
else
cout << “Not Equal”;

return 0;
} |

| | // 두 문자열의 연결
#include
#include
#include
using namespace std;

class string
{
char str;
public:
string()
{
str = new char[30] ;
str = NULL;
}
string(char *s) { str = s; }
string operator +(string ts)
{
string t;
strcat(t.str, str);
strcat(t.str, ts.str);
return t;
}
void putstring()
{
cout << endl << str;
}
};

int main()
{
string s1(“Computer”); string s2(“Institute”);
s1.putstring(); s2.putstring();
string s3;

s3 = s1 + s2;

s3.putstring();
return 0;
} |

참고: Turbo C++의 객체 지향 프로그래밍: 로버트 라포르

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.