SlideShare a Scribd company logo
1 of 22
13. 연산자 오버로딩
차례 
• 객체 연산 
• 연산자 오버로딩 
2/14
함수와 연산자 오버로딩 
• 함수 오버로딩 
같은 함수 이름으로 함수의 반환형이나 매개변수 
를 다르게 하여 재정의하는 것 
• 연산자 오버로딩 
정수형, 배정도형 데이터의 덧셈 등 이미 제공된 
연산을 특정 클래스의 덧셈, 곱셈 등으로 다시 정 
의하여 사용하는 것
연산자 오버로딩을 사용하는 이유 
객체지형 언어에서는 기본 개념을 익히 후에 이미 정의된 
클래스를 얼마나 적절하게 사용하는 것이 중요 
클래스마다 동일하게 사용하도록 설계해서 쉽게 가져와 적 
용하기 사용 
기존 클래스 사용 습득에 대해 시간 단축 
(e.g., strcat(str, str1); strcat(str, str2); str=str1+str2; 
Class Complex { 
… 
Add(Complex tmp); 
… 
}; 
01 Complex c1, c2, c3; 
02 c3 = c1.Add(c2) 
01 c3 = c1 + c2;
07 연산자 오버로딩 
 연산자 오버로딩의 의미 
 연산자 오버로딩에 대해 정리하면 다음과 같다. 
 연산자 오버로딩은 C++에서 기본 자료형으로 사용하는 연산자를 재정의하는 것이다. 
 C++에서는 연산자조차 함수로 취급하기 때문에 함수를 정의하는 방법과 동일한 방법으로 연산자를 오버 
로딩할 수 있다. 
 연산자를 함수의 형태로 오버로딩하기 때문에 오버로딩된 연산자를 연산자 함수라고도 한다. 
 연산자를 정의할 때 연산에 참여하는 피연산자는 매개변수로 구현된다. 
 연산자를 정의할 때 매개변수의 자료형에 의해 그 연산자를 사용할 수 있는 자료형이 결정된다. 
 연산자 함수명은 기본 자료형에 의해 사용되던 연산자를 operator 예약어와 함께 연산 기호로 표현한다. 
반환값 operator 연산자(매개변수1, 매개변수2, ...) 
{ 
함수의 본체 
} 
 Complex 객체를 피연산자로 하는 연산자 오버로딩 
 이미 수치형 자료에 사용되는 + 연산자를 Complex 객체에 대해서 연산하도록 연산자 오버로딩을 해 보자. 
Complex x(10,20), y(20, 40), z; 
z = x + y;
07 연산자 오버로딩 
 두 객체를 더하려고 기술한 z = x + y; 문장은 프로그래머에게 보기 편한 형태지만 연산자 함수를 쉽게 정의 
하려고 컴파일러에 의해서는 호출되는 형태로 변경해 보자. 
z = x.operator+(y); 
 복소수의 덧셈을 구하는 멤버함수 Sum을 호출하는 구조와 동일하다. 
z = x.Sum(y); 
 + 연산자 함수의 정의 역시 Sum 함수와 동일하다. 단지 함수명만 Sum에서 operator로 바꾸어 놓은 것 같다. 
함수로 구현한 예 연산자로 구현한 예 
Complex Complex::Sum(Complex rightHand) 
{ 
... 
} 
 Complex 클래스에 대해서도 2가지 용도로 정의할 수 있는 - 연산자를 오버로딩해 보자. 먼저 뺄셈 용도로 사 
용되는 - 연산자부터 정의해 보자. 
Complex Complex::operator+(Complex rightHand) 
{ 
... 
} 
Complex Complex::operator-(const Complex &rightHand) const 
{ 
Complex res; 
res.real = this->real - rightHand.real; 
res.image = this->image - rightHand.image; 
return res; 
}
피연산자가 두 개인 연산자(1) 
 피연산자가 두 개인 + 연산자를 오버로딩 하는 예 
class Complex 
{ 
// 중간 생략 
Complex operator+(const Complex& right) 
{ 
// 실수부와 허수부를 각각 더한다. 
int real = this->real + right.real; 
int imag = this->imaginary + right.imaginary; 
// 결과를 보관한 복소수 객체를 반환한다. 
return Complex(real, imag); 
} 
Complex c1(1, 1); 
Complex c2(2, 2); 
Complex c3(0, 0); 
// + 연산자를 사용한 덧셈 
c3 = c1 + c2; // c3 = (3, 3) 
c3 = c1.operator +(c2); 
소스-1 Complex 클래스 참고
일반 함수를 사용한 연산자 오버로딩(1) 
 멤버 함수가 아닌 일반 함수를 사용해서 + 연산자를 오버로딩 
하는 예 
Complex operator+(const Complex& left, const Complex& right) 
{ 
// 실수부와 허수부를 각각 더한다. 
int real = left.real + right.real; 
int imag = left.imaginary + right.imaginary; 
// 결과를 보관한 복소수 객체를 반환한다. 
return Complex(real, imag); 
} 
int main() 
{ 
Complex c1(1, 1); 
Complex c2(2, 2); 
Complex c3(0, 0); 
// + 연산자를 사용한 덧셈 
c3 = c1 + c2; // c3 = (3, 3) 
c3 = operator +(c1, c2); 
return 0; 
}
객체 연산 
• 허수 클래스를 정의하고, 객체를 생성하여 허수 
덧셈을 실행하기 
클 클래스스:래 ImaginaryNumber 
멤 수버스버: 
실 실수허수부와스부수와스(허 는수실스와부수0래 실수아닌스 스) 
멤 수함스버: 
생 자성1: 실 가부수0, 허 가부수1로 로 초스 
생 자성2: 실 수실 와 스 를개하허버수수수스부로를수스부스와스 
실 함를수각값각는 스스허와수스 부과스스수부스 
실 함객각를수부각객하로와체는 스스허스스와수 스부과스스수부스 
허 함수 성 하자는열스는와하스로스수스 
9/14
소스 13-1 (ch13_ImaginaryNumber.h) 
#ifndef _IMAGINARY_ 
#define _IMAGINARY_ 
#include <iostream> 
#include <string> 
using namespace std; 
class ImaginaryNumber 
{ 
public: 
ImaginaryNumber(); 
ImaginaryNumber(const double a, const double b); 
void SetA(const double a); 
void SetB(const double b); 
double GetA(); 
double GetB(); 
string GetImaginaryNumber(); 
private: 
double a; //실수부 
double b; //허수부 (b≠0) 
}; 
#else 
#endif
허수의 덧셈 
멤버 함수 추가 
ImaginaryNumber AddImaginary(const ImaginaryNumber ima); 
 자 자신과 개버수를 더해서 결과 와 리턴함 
멤버 함수 실와 
ImaginaryNumber ImaginaryNumber::AddImaginary(const ImaginaryNumber ima) 
{ 
ImaginaryNumber res; 
res.a=this->a+ima.a; 
res.b=this->b+ima.b; 
return res; 
} 
객체 덧셈와 위한 함수 실와
허수 덧셈 테스트 
소스 13-5 (ch13_02.cpp) 
#include "ch13_ImaginaryNumber.h" 
int main() 
{ 
ImaginaryNumber ima1(4.2,5.1); 
ImaginaryNumber ima2; 
ImaginaryNumber ima3; 
ima2.SetA(7.2); 
ima2.SetB(9.6); 
ima3=ima1.AddImaginary(ima2); //ima1과 ima2와 덧셈 결과가 리턴, ima3에 할당 
cout << "( " << ima1.GetImaginaryNumber() << " ) + "; 
cout << "( " << ima2.GetImaginaryNumber() << " ) = "; 
cout << ima3.GetImaginaryNumber() << endl; 
return 0; 
}
연산자 오버로딩 1 
• 연산자 오버로딩 
– 연산 대상에 대한 연산자 재정의 
3+4  실수와 덧셈 연산 가능함!!! 
class TEST 
{ 
…. 
}; 
TEST a, b; 
a+b  연산 불가능, TEST와 객체를 대상으로 하는 덧셈 연산 오버로딩해야함 
string스str1(“computer”),스str2(“science”); 
str1+str2  연산 가능, string 객체를 대상으로 하는 덧셈 연산래 오버로딩되어 
있음 
13/14
연산자 오버로딩 2 
• 연산자 오버로딩 함수 프로토타입 
함수반환는 operator 연산자 (연산대상); 
ImaginaryNumber 클래스에 덧셈 연산 함수를 실와하면~ 
함수 선언 : 
ImaginaryNumber operator+(const ImaginaryNumber object); 
함수 실와 : 
ImaginaryNumber ImaginaryNumber::operator+(const ImaginaryNumber object) //연산자 
오버로딩에 와해 추가된 연산자 함수 
{ 
ImaginaryNumber res; 
res.a=this->a+object.a; 
res.b=this->b+object.b; 
return res; 
} 14/14
소스 13-6 (ch13_03.cpp) 
허수와 덧셈 객체 연산자 오버로딩 테스트~ 
#include "ch13_ImaginaryNumber.h" 
int main() 
{ 
ImaginaryNumber ima1(2.7,6.3); 
ImaginaryNumber ima2; 
ImaginaryNumber ima3; 
ima2.SetA(7.2); 
ima2.SetB(9.6); 
ima3=ima1+ima2; //연산자 오버로딩으로 인해 덧셈 연산자 사용 가능!! 
cout << "( " << ima1.GetImaginaryNumber() << " ) + "; 
cout << "( " << ima2.GetImaginaryNumber() << " ) = "; 
cout << ima3.GetImaginaryNumber() << endl; 
return 0; 
} 
소스-2 연산자 오버로딩 참고
증감 연산자 오버로딩 
• 증감 연산자 
– 선 증감 : ++a, --a 
– 후 증감 : a++, a-- 
클래스는 operator++( ); //선 증감 연산자 오버로딩 
클래스는 operator++(int dummy); //후 증감 연산자 오버로딩 
ImaginaryNumber 클래스와 증가 연산자 오버로딩 
ImaginaryNumber operator++(void); 
ImaginaryNumber operator++(int dummy); 
16/14
소스 13-9 (ch13_ImanginaryNumber.cpp) 
ImaginaryNumber ImaginaryNumber::operator++(void) //연산자 오버로딩에 와 
해 추가된 연산자 함수 
{ 
this->a++; 
return *this; 
} 
ImaginaryNumber ImaginaryNumber::operator++(int dummy) 
{ 
this->b++; 
return *this; 
} 
소스-3 증감 연산자 오버로딩 참고
실습 – 시간 클래스 정의하기 
클 클래스스:래 Time 
멤 수버스버: 시, 분, 초 시 를간위초와로초실스스스수 와는부를스스위간스는스를스 
멤 수함스버: 
생 자성1: 버수를멤버스 래스개버수스0으 로 초스로 
생 자성2: 시, 분, 초 초 로를개버하버전수수 스로와멤스스버스스와 
초 함버 수 전멤시멤산 를 버간버하위간와스와스는로는스스스스스스CalSecond( ) 
각 함수버 멤전실버멤 하스버와는스스스스 
각 함멤수있버버는스멤전객 수스버 부를스스와로할스스스스 
'00시 00분 00초' 는 함수멤버 스를하객는부스에스하로스
소스 13-10 (ch13_Time.h) 
#ifndef _TIME_ 
#define _TIME_ 
#include <iostream> 
#include <string> 
#define HOUR_SEC 3600 
#define MIN_SEC 60 
using namespace std; 
class Time 
{ 
public : 
Time(); 
Time(const int hour, const int min, const int sec); 
void SetHour(const int hour); 
void SetMin(const int min); 
void SetSec(const int sec); 
int GetHour(); 
int GetMin(); 
int GetSec(); 
int CalSec(); 
string ShowTime(); 
private : 
int hour, min, sec; 
int t_sec; 
}; 
#else 
#endif
Time 클래스에 <=, >= 오버로딩하기 
멤버 함수 선언 
bool operator<=(Time timeObj); 
bool operator>=(Time timeObj); 
멤버 함수 실와 
bool Time::operator<=(Time timeObj) 
{ 
this->CalSec(); 
timeObj.CalSec(); 
if (this->t_sec<=timeObj.t_sec) 
return true; 
else 
return false; 
}
소스 13-16 (ch13_06.cpp) Time 클래스 테스트 
#include "ch13_Time.h" 
int main() 
{ 
Time t1(7,30,20); 
cout << t1.ShowTime() << endl; 
cout << "시간 - 초 위 : " << t1.CalSec() << endl; 
Time t2(4,50,23); 
if (t1>=t2) 
cout << t1.ShowTime() << "래 " << t2.ShowTime() << "보다 크거 같다!!" << endl; 
else 
cout << t2.ShowTime() << "래 " << t1.ShowTime() << "보다 크거 같다!!" << endl; 
if (t1<=t2) 
cout << t2.ShowTime() << "래 " << t1.ShowTime() << "보다 크거 같다!!" << endl; 
else 
cout << t1.ShowTime() << "래 " << t2.ShowTime() << "보다 크거 같다!!" << endl; 
return 0; 
}
07 연산자 오버로딩 
 연산자를 오버로딩할 때의 주의사항 
 C++에서 이미 사용하던 연산자만 오버로딩할 수 있다. $ 기호는 C++에서 연산자로 사용되지 않는다. 그러 
므로 operator$( ) 함수를 정의할 수 없다. 
 이항 연산자는 이항 연산자로, 단항 연산자는 단항 연산자로만 오버로딩할 수 있다. 예를 들면 10%4와 같이 
% 연산자는 이항 연산자 형태로 오버로딩해야 한다. 다음은 잘못된 예다. 
int a; 
% a; // 나머지를 구하는 연산자를 단항 연산자로 사용하지 못한다. 
Complex x; 
% x; // 나머지를 구하는 연산자를 단항 연산자로 오버로딩할 수 없다. 
 C++에서 사용하는 연산자 중에서 다음 연산자는 오버로딩할 수 없다. .(멤버 참조 연산자), ::(스코프 연산자), 
?:(조건 연산자 ), sizeof(sizeof 연산자 ), *(포인터 연산자) 
 연산자를 오버로딩하려면 피연산자가 적어도 하나 이상은 사용자 정의 자료형이어야 한다. 이는 기본 자료형 
에 대한 연산자 오버로딩을 방지하기 위해서다. 다음은 잘못된 예다. 
double operator+(double x, double y) // 잘못된 연산자 오버로딩 
 대부분의 연산자는 멤버함수 또는 프렌드 함수로 오버로딩할 수 있다. 그러나 다음 연산자는 멤버함수로만 
오버로딩할 수 있다. 
=(대입 연산자 ), ( )(함수 호출 연산자), [ ](첨자 지정 연산자), ->(객체 포인터에 대한 멤버 참조 연산자)

More Related Content

What's hot

Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Circulus
 
Haskell study 12
Haskell study 12Haskell study 12
Haskell study 12Nam Hyeonuk
 
C++ 11 에 대해서 쉽게 알아봅시다 1부
C++ 11 에 대해서 쉽게 알아봅시다 1부C++ 11 에 대해서 쉽게 알아봅시다 1부
C++ 11 에 대해서 쉽게 알아봅시다 1부Gwangwhi Mah
 
C++정리 스마트포인터
C++정리 스마트포인터C++정리 스마트포인터
C++정리 스마트포인터fefe7270
 
Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저Circulus
 
Haskell study 15
Haskell study 15Haskell study 15
Haskell study 15Nam Hyeonuk
 
[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features SummaryChris Ohk
 
자료구조 Project1
자료구조 Project1자료구조 Project1
자료구조 Project1KoChungWook
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기Chris Ohk
 
포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++KWANGIL KIM
 
2.Startup JavaScript - 연산자
2.Startup JavaScript - 연산자2.Startup JavaScript - 연산자
2.Startup JavaScript - 연산자Circulus
 
Effective Python, Clean Code
Effective Python, Clean CodeEffective Python, Clean Code
Effective Python, Clean CodeJinHwan2
 
Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택JinTaek Seo
 
스위프트 성능 이해하기
스위프트 성능 이해하기스위프트 성능 이해하기
스위프트 성능 이해하기Yongha Yoo
 
하스켈 프로그래밍 입문
하스켈 프로그래밍 입문하스켈 프로그래밍 입문
하스켈 프로그래밍 입문Kwang Yul Seo
 
종이접기(fold) 프로그래밍
종이접기(fold) 프로그래밍종이접기(fold) 프로그래밍
종이접기(fold) 프로그래밍Kwang Yul Seo
 

What's hot (20)

C++11
C++11C++11
C++11
 
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
 
Haskell study 12
Haskell study 12Haskell study 12
Haskell study 12
 
C++ 11 에 대해서 쉽게 알아봅시다 1부
C++ 11 에 대해서 쉽게 알아봅시다 1부C++ 11 에 대해서 쉽게 알아봅시다 1부
C++ 11 에 대해서 쉽게 알아봅시다 1부
 
C++정리 스마트포인터
C++정리 스마트포인터C++정리 스마트포인터
C++정리 스마트포인터
 
Haskell study 5
Haskell study 5Haskell study 5
Haskell study 5
 
Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저
 
Haskell study 15
Haskell study 15Haskell study 15
Haskell study 15
 
[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary
 
자료구조 Project1
자료구조 Project1자료구조 Project1
자료구조 Project1
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
 
포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++
 
2.Startup JavaScript - 연산자
2.Startup JavaScript - 연산자2.Startup JavaScript - 연산자
2.Startup JavaScript - 연산자
 
Effective Python, Clean Code
Effective Python, Clean CodeEffective Python, Clean Code
Effective Python, Clean Code
 
Changes in c++0x
Changes in c++0xChanges in c++0x
Changes in c++0x
 
Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택
 
스위프트 성능 이해하기
스위프트 성능 이해하기스위프트 성능 이해하기
스위프트 성능 이해하기
 
Haskell study 4
Haskell study 4Haskell study 4
Haskell study 4
 
하스켈 프로그래밍 입문
하스켈 프로그래밍 입문하스켈 프로그래밍 입문
하스켈 프로그래밍 입문
 
종이접기(fold) 프로그래밍
종이접기(fold) 프로그래밍종이접기(fold) 프로그래밍
종이접기(fold) 프로그래밍
 

Similar to 13장 연산자 오버로딩

자바8 스트림 API 소개
자바8 스트림 API 소개자바8 스트림 API 소개
자바8 스트림 API 소개beom kyun choi
 
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌Seok-joon Yun
 
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍Young-Beom Rhee
 
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩[아꿈사] The C++ Programming Language 11장 연산자 오버로딩
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩해강
 
1.자료구조와 알고리즘(강의자료)
1.자료구조와 알고리즘(강의자료)1.자료구조와 알고리즘(강의자료)
1.자료구조와 알고리즘(강의자료)fmbvbfhs
 
프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기Jongwook Choi
 
Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기지수 윤
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심흥배 최
 
Computational Complexity
Computational ComplexityComputational Complexity
Computational Complexityskku_npc
 
Function approximation as supervised learning
Function approximation as supervised learningFunction approximation as supervised learning
Function approximation as supervised learningSunggon Song
 
Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식TonyCms
 
파이썬+Operator+이해하기 20160409
파이썬+Operator+이해하기 20160409파이썬+Operator+이해하기 20160409
파이썬+Operator+이해하기 20160409Yong Joon Moon
 
More effective c++ chapter1,2
More effective c++ chapter1,2More effective c++ chapter1,2
More effective c++ chapter1,2문익 장
 
스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오Taeoh Kim
 
More effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinMore effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinDong Chan Shin
 
Lambda 란 무엇인가
Lambda 란 무엇인가Lambda 란 무엇인가
Lambda 란 무엇인가Vong Sik Kong
 

Similar to 13장 연산자 오버로딩 (20)

자바8 스트림 API 소개
자바8 스트림 API 소개자바8 스트림 API 소개
자바8 스트림 API 소개
 
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
 
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
 
함수적 사고 2장
함수적 사고 2장함수적 사고 2장
함수적 사고 2장
 
06장 함수
06장 함수06장 함수
06장 함수
 
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩[아꿈사] The C++ Programming Language 11장 연산자 오버로딩
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩
 
1.자료구조와 알고리즘(강의자료)
1.자료구조와 알고리즘(강의자료)1.자료구조와 알고리즘(강의자료)
1.자료구조와 알고리즘(강의자료)
 
프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기
 
Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기
 
5 swift 기초함수
5 swift 기초함수5 swift 기초함수
5 swift 기초함수
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심
 
Computational Complexity
Computational ComplexityComputational Complexity
Computational Complexity
 
Function approximation as supervised learning
Function approximation as supervised learningFunction approximation as supervised learning
Function approximation as supervised learning
 
Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식
 
파이썬+Operator+이해하기 20160409
파이썬+Operator+이해하기 20160409파이썬+Operator+이해하기 20160409
파이썬+Operator+이해하기 20160409
 
More effective c++ chapter1,2
More effective c++ chapter1,2More effective c++ chapter1,2
More effective c++ chapter1,2
 
스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오
 
More effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinMore effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshin
 
6 function
6 function6 function
6 function
 
Lambda 란 무엇인가
Lambda 란 무엇인가Lambda 란 무엇인가
Lambda 란 무엇인가
 

More from 유석 남

02장 Introduction to Java Applications
02장 Introduction to Java Applications02장 Introduction to Java Applications
02장 Introduction to Java Applications유석 남
 
01장 Introduction to Computers and Java
01장 Introduction to Computers and Java01장 Introduction to Computers and Java
01장 Introduction to Computers and Java유석 남
 
12장 상속 (고급)
12장 상속 (고급)12장 상속 (고급)
12장 상속 (고급)유석 남
 
11장 상속
11장 상속11장 상속
11장 상속유석 남
 
10장 문자열 클래스와 파일 클래스
10장 문자열 클래스와 파일 클래스10장 문자열 클래스와 파일 클래스
10장 문자열 클래스와 파일 클래스유석 남
 
09장 객체와 클래스 (고급)
09장 객체와 클래스 (고급)09장 객체와 클래스 (고급)
09장 객체와 클래스 (고급)유석 남
 
08장 객체와 클래스 (기본)
08장 객체와 클래스 (기본)08장 객체와 클래스 (기본)
08장 객체와 클래스 (기본)유석 남
 
05장 논리적 자료표현: 구조체
05장 논리적 자료표현: 구조체05장 논리적 자료표현: 구조체
05장 논리적 자료표현: 구조체유석 남
 
04장 고급변수 사용
04장 고급변수 사용04장 고급변수 사용
04장 고급변수 사용유석 남
 
03장 조건문, 반복문, 네임스페이스
03장 조건문, 반복문, 네임스페이스03장 조건문, 반복문, 네임스페이스
03장 조건문, 반복문, 네임스페이스유석 남
 
[20140624]소개자료
[20140624]소개자료[20140624]소개자료
[20140624]소개자료유석 남
 

More from 유석 남 (12)

02장 Introduction to Java Applications
02장 Introduction to Java Applications02장 Introduction to Java Applications
02장 Introduction to Java Applications
 
01장 Introduction to Computers and Java
01장 Introduction to Computers and Java01장 Introduction to Computers and Java
01장 Introduction to Computers and Java
 
12장 상속 (고급)
12장 상속 (고급)12장 상속 (고급)
12장 상속 (고급)
 
11장 상속
11장 상속11장 상속
11장 상속
 
10장 문자열 클래스와 파일 클래스
10장 문자열 클래스와 파일 클래스10장 문자열 클래스와 파일 클래스
10장 문자열 클래스와 파일 클래스
 
09장 객체와 클래스 (고급)
09장 객체와 클래스 (고급)09장 객체와 클래스 (고급)
09장 객체와 클래스 (고급)
 
08장 객체와 클래스 (기본)
08장 객체와 클래스 (기본)08장 객체와 클래스 (기본)
08장 객체와 클래스 (기본)
 
05장 논리적 자료표현: 구조체
05장 논리적 자료표현: 구조체05장 논리적 자료표현: 구조체
05장 논리적 자료표현: 구조체
 
04장 고급변수 사용
04장 고급변수 사용04장 고급변수 사용
04장 고급변수 사용
 
03장 조건문, 반복문, 네임스페이스
03장 조건문, 반복문, 네임스페이스03장 조건문, 반복문, 네임스페이스
03장 조건문, 반복문, 네임스페이스
 
[20140624]소개자료
[20140624]소개자료[20140624]소개자료
[20140624]소개자료
 
Example
ExampleExample
Example
 

13장 연산자 오버로딩

  • 2. 차례 • 객체 연산 • 연산자 오버로딩 2/14
  • 3. 함수와 연산자 오버로딩 • 함수 오버로딩 같은 함수 이름으로 함수의 반환형이나 매개변수 를 다르게 하여 재정의하는 것 • 연산자 오버로딩 정수형, 배정도형 데이터의 덧셈 등 이미 제공된 연산을 특정 클래스의 덧셈, 곱셈 등으로 다시 정 의하여 사용하는 것
  • 4. 연산자 오버로딩을 사용하는 이유 객체지형 언어에서는 기본 개념을 익히 후에 이미 정의된 클래스를 얼마나 적절하게 사용하는 것이 중요 클래스마다 동일하게 사용하도록 설계해서 쉽게 가져와 적 용하기 사용 기존 클래스 사용 습득에 대해 시간 단축 (e.g., strcat(str, str1); strcat(str, str2); str=str1+str2; Class Complex { … Add(Complex tmp); … }; 01 Complex c1, c2, c3; 02 c3 = c1.Add(c2) 01 c3 = c1 + c2;
  • 5. 07 연산자 오버로딩  연산자 오버로딩의 의미  연산자 오버로딩에 대해 정리하면 다음과 같다.  연산자 오버로딩은 C++에서 기본 자료형으로 사용하는 연산자를 재정의하는 것이다.  C++에서는 연산자조차 함수로 취급하기 때문에 함수를 정의하는 방법과 동일한 방법으로 연산자를 오버 로딩할 수 있다.  연산자를 함수의 형태로 오버로딩하기 때문에 오버로딩된 연산자를 연산자 함수라고도 한다.  연산자를 정의할 때 연산에 참여하는 피연산자는 매개변수로 구현된다.  연산자를 정의할 때 매개변수의 자료형에 의해 그 연산자를 사용할 수 있는 자료형이 결정된다.  연산자 함수명은 기본 자료형에 의해 사용되던 연산자를 operator 예약어와 함께 연산 기호로 표현한다. 반환값 operator 연산자(매개변수1, 매개변수2, ...) { 함수의 본체 }  Complex 객체를 피연산자로 하는 연산자 오버로딩  이미 수치형 자료에 사용되는 + 연산자를 Complex 객체에 대해서 연산하도록 연산자 오버로딩을 해 보자. Complex x(10,20), y(20, 40), z; z = x + y;
  • 6. 07 연산자 오버로딩  두 객체를 더하려고 기술한 z = x + y; 문장은 프로그래머에게 보기 편한 형태지만 연산자 함수를 쉽게 정의 하려고 컴파일러에 의해서는 호출되는 형태로 변경해 보자. z = x.operator+(y);  복소수의 덧셈을 구하는 멤버함수 Sum을 호출하는 구조와 동일하다. z = x.Sum(y);  + 연산자 함수의 정의 역시 Sum 함수와 동일하다. 단지 함수명만 Sum에서 operator로 바꾸어 놓은 것 같다. 함수로 구현한 예 연산자로 구현한 예 Complex Complex::Sum(Complex rightHand) { ... }  Complex 클래스에 대해서도 2가지 용도로 정의할 수 있는 - 연산자를 오버로딩해 보자. 먼저 뺄셈 용도로 사 용되는 - 연산자부터 정의해 보자. Complex Complex::operator+(Complex rightHand) { ... } Complex Complex::operator-(const Complex &rightHand) const { Complex res; res.real = this->real - rightHand.real; res.image = this->image - rightHand.image; return res; }
  • 7. 피연산자가 두 개인 연산자(1)  피연산자가 두 개인 + 연산자를 오버로딩 하는 예 class Complex { // 중간 생략 Complex operator+(const Complex& right) { // 실수부와 허수부를 각각 더한다. int real = this->real + right.real; int imag = this->imaginary + right.imaginary; // 결과를 보관한 복소수 객체를 반환한다. return Complex(real, imag); } Complex c1(1, 1); Complex c2(2, 2); Complex c3(0, 0); // + 연산자를 사용한 덧셈 c3 = c1 + c2; // c3 = (3, 3) c3 = c1.operator +(c2); 소스-1 Complex 클래스 참고
  • 8. 일반 함수를 사용한 연산자 오버로딩(1)  멤버 함수가 아닌 일반 함수를 사용해서 + 연산자를 오버로딩 하는 예 Complex operator+(const Complex& left, const Complex& right) { // 실수부와 허수부를 각각 더한다. int real = left.real + right.real; int imag = left.imaginary + right.imaginary; // 결과를 보관한 복소수 객체를 반환한다. return Complex(real, imag); } int main() { Complex c1(1, 1); Complex c2(2, 2); Complex c3(0, 0); // + 연산자를 사용한 덧셈 c3 = c1 + c2; // c3 = (3, 3) c3 = operator +(c1, c2); return 0; }
  • 9. 객체 연산 • 허수 클래스를 정의하고, 객체를 생성하여 허수 덧셈을 실행하기 클 클래스스:래 ImaginaryNumber 멤 수버스버: 실 실수허수부와스부수와스(허 는수실스와부수0래 실수아닌스 스) 멤 수함스버: 생 자성1: 실 가부수0, 허 가부수1로 로 초스 생 자성2: 실 수실 와 스 를개하허버수수수스부로를수스부스와스 실 함를수각값각는 스스허와수스 부과스스수부스 실 함객각를수부각객하로와체는 스스허스스와수 스부과스스수부스 허 함수 성 하자는열스는와하스로스수스 9/14
  • 10. 소스 13-1 (ch13_ImaginaryNumber.h) #ifndef _IMAGINARY_ #define _IMAGINARY_ #include <iostream> #include <string> using namespace std; class ImaginaryNumber { public: ImaginaryNumber(); ImaginaryNumber(const double a, const double b); void SetA(const double a); void SetB(const double b); double GetA(); double GetB(); string GetImaginaryNumber(); private: double a; //실수부 double b; //허수부 (b≠0) }; #else #endif
  • 11. 허수의 덧셈 멤버 함수 추가 ImaginaryNumber AddImaginary(const ImaginaryNumber ima);  자 자신과 개버수를 더해서 결과 와 리턴함 멤버 함수 실와 ImaginaryNumber ImaginaryNumber::AddImaginary(const ImaginaryNumber ima) { ImaginaryNumber res; res.a=this->a+ima.a; res.b=this->b+ima.b; return res; } 객체 덧셈와 위한 함수 실와
  • 12. 허수 덧셈 테스트 소스 13-5 (ch13_02.cpp) #include "ch13_ImaginaryNumber.h" int main() { ImaginaryNumber ima1(4.2,5.1); ImaginaryNumber ima2; ImaginaryNumber ima3; ima2.SetA(7.2); ima2.SetB(9.6); ima3=ima1.AddImaginary(ima2); //ima1과 ima2와 덧셈 결과가 리턴, ima3에 할당 cout << "( " << ima1.GetImaginaryNumber() << " ) + "; cout << "( " << ima2.GetImaginaryNumber() << " ) = "; cout << ima3.GetImaginaryNumber() << endl; return 0; }
  • 13. 연산자 오버로딩 1 • 연산자 오버로딩 – 연산 대상에 대한 연산자 재정의 3+4  실수와 덧셈 연산 가능함!!! class TEST { …. }; TEST a, b; a+b  연산 불가능, TEST와 객체를 대상으로 하는 덧셈 연산 오버로딩해야함 string스str1(“computer”),스str2(“science”); str1+str2  연산 가능, string 객체를 대상으로 하는 덧셈 연산래 오버로딩되어 있음 13/14
  • 14. 연산자 오버로딩 2 • 연산자 오버로딩 함수 프로토타입 함수반환는 operator 연산자 (연산대상); ImaginaryNumber 클래스에 덧셈 연산 함수를 실와하면~ 함수 선언 : ImaginaryNumber operator+(const ImaginaryNumber object); 함수 실와 : ImaginaryNumber ImaginaryNumber::operator+(const ImaginaryNumber object) //연산자 오버로딩에 와해 추가된 연산자 함수 { ImaginaryNumber res; res.a=this->a+object.a; res.b=this->b+object.b; return res; } 14/14
  • 15. 소스 13-6 (ch13_03.cpp) 허수와 덧셈 객체 연산자 오버로딩 테스트~ #include "ch13_ImaginaryNumber.h" int main() { ImaginaryNumber ima1(2.7,6.3); ImaginaryNumber ima2; ImaginaryNumber ima3; ima2.SetA(7.2); ima2.SetB(9.6); ima3=ima1+ima2; //연산자 오버로딩으로 인해 덧셈 연산자 사용 가능!! cout << "( " << ima1.GetImaginaryNumber() << " ) + "; cout << "( " << ima2.GetImaginaryNumber() << " ) = "; cout << ima3.GetImaginaryNumber() << endl; return 0; } 소스-2 연산자 오버로딩 참고
  • 16. 증감 연산자 오버로딩 • 증감 연산자 – 선 증감 : ++a, --a – 후 증감 : a++, a-- 클래스는 operator++( ); //선 증감 연산자 오버로딩 클래스는 operator++(int dummy); //후 증감 연산자 오버로딩 ImaginaryNumber 클래스와 증가 연산자 오버로딩 ImaginaryNumber operator++(void); ImaginaryNumber operator++(int dummy); 16/14
  • 17. 소스 13-9 (ch13_ImanginaryNumber.cpp) ImaginaryNumber ImaginaryNumber::operator++(void) //연산자 오버로딩에 와 해 추가된 연산자 함수 { this->a++; return *this; } ImaginaryNumber ImaginaryNumber::operator++(int dummy) { this->b++; return *this; } 소스-3 증감 연산자 오버로딩 참고
  • 18. 실습 – 시간 클래스 정의하기 클 클래스스:래 Time 멤 수버스버: 시, 분, 초 시 를간위초와로초실스스스수 와는부를스스위간스는스를스 멤 수함스버: 생 자성1: 버수를멤버스 래스개버수스0으 로 초스로 생 자성2: 시, 분, 초 초 로를개버하버전수수 스로와멤스스버스스와 초 함버 수 전멤시멤산 를 버간버하위간와스와스는로는스스스스스스CalSecond( ) 각 함수버 멤전실버멤 하스버와는스스스스 각 함멤수있버버는스멤전객 수스버 부를스스와로할스스스스 '00시 00분 00초' 는 함수멤버 스를하객는부스에스하로스
  • 19. 소스 13-10 (ch13_Time.h) #ifndef _TIME_ #define _TIME_ #include <iostream> #include <string> #define HOUR_SEC 3600 #define MIN_SEC 60 using namespace std; class Time { public : Time(); Time(const int hour, const int min, const int sec); void SetHour(const int hour); void SetMin(const int min); void SetSec(const int sec); int GetHour(); int GetMin(); int GetSec(); int CalSec(); string ShowTime(); private : int hour, min, sec; int t_sec; }; #else #endif
  • 20. Time 클래스에 <=, >= 오버로딩하기 멤버 함수 선언 bool operator<=(Time timeObj); bool operator>=(Time timeObj); 멤버 함수 실와 bool Time::operator<=(Time timeObj) { this->CalSec(); timeObj.CalSec(); if (this->t_sec<=timeObj.t_sec) return true; else return false; }
  • 21. 소스 13-16 (ch13_06.cpp) Time 클래스 테스트 #include "ch13_Time.h" int main() { Time t1(7,30,20); cout << t1.ShowTime() << endl; cout << "시간 - 초 위 : " << t1.CalSec() << endl; Time t2(4,50,23); if (t1>=t2) cout << t1.ShowTime() << "래 " << t2.ShowTime() << "보다 크거 같다!!" << endl; else cout << t2.ShowTime() << "래 " << t1.ShowTime() << "보다 크거 같다!!" << endl; if (t1<=t2) cout << t2.ShowTime() << "래 " << t1.ShowTime() << "보다 크거 같다!!" << endl; else cout << t1.ShowTime() << "래 " << t2.ShowTime() << "보다 크거 같다!!" << endl; return 0; }
  • 22. 07 연산자 오버로딩  연산자를 오버로딩할 때의 주의사항  C++에서 이미 사용하던 연산자만 오버로딩할 수 있다. $ 기호는 C++에서 연산자로 사용되지 않는다. 그러 므로 operator$( ) 함수를 정의할 수 없다.  이항 연산자는 이항 연산자로, 단항 연산자는 단항 연산자로만 오버로딩할 수 있다. 예를 들면 10%4와 같이 % 연산자는 이항 연산자 형태로 오버로딩해야 한다. 다음은 잘못된 예다. int a; % a; // 나머지를 구하는 연산자를 단항 연산자로 사용하지 못한다. Complex x; % x; // 나머지를 구하는 연산자를 단항 연산자로 오버로딩할 수 없다.  C++에서 사용하는 연산자 중에서 다음 연산자는 오버로딩할 수 없다. .(멤버 참조 연산자), ::(스코프 연산자), ?:(조건 연산자 ), sizeof(sizeof 연산자 ), *(포인터 연산자)  연산자를 오버로딩하려면 피연산자가 적어도 하나 이상은 사용자 정의 자료형이어야 한다. 이는 기본 자료형 에 대한 연산자 오버로딩을 방지하기 위해서다. 다음은 잘못된 예다. double operator+(double x, double y) // 잘못된 연산자 오버로딩  대부분의 연산자는 멤버함수 또는 프렌드 함수로 오버로딩할 수 있다. 그러나 다음 연산자는 멤버함수로만 오버로딩할 수 있다. =(대입 연산자 ), ( )(함수 호출 연산자), [ ](첨자 지정 연산자), ->(객체 포인터에 대한 멤버 참조 연산자)