- Introduction
- Polymorphism ์ฌ๋ก
- ํธ๋ค์ ์๋ฃํ์ ์ํ ๋ฉค๋ฒ ํจ์ ํธ์ถ (without Polymorphism)
- Polymorphism ๊ตฌํ (๊ฐ์ ํจ์์ ์ํ ๋์ ๋ฐ์ธ๋ฉ)
- Abstract Classes and Pure Virtual Functions
- Case Study: Payroll System Using Polymorphism
์ค๋ฒ๋ก๋ฉ์ ๊ฐ์ ํจ์๋ผ๋ ๋งค๊ฐ๋ณ์๋ง ๋ค๋ฅด๋ฉด ์ผ๋ง๋ ์ง ์ ์ํ๊ณ ์ฌ์ฉํ ์ ์๋ค.
- ํจ์ ์ด๋ฆ์ด ๊ฐ์์ผ ํ๋ค.
- ๋งค๊ฐ๋ณ์์ ์๋ฃํ์ด ๋ค๋ฅด๊ฑฐ๋ ๊ฐ์๊ฐ ๋ฌ๋ผ์ผ ํ๋ค.
- ๋ฐํํ์ ์ฐจ์ด๋ ์ค๋ฒ๋ก๋ฉ์ ์กฐ๊ฑด์ ๋ง์กฑ์ํค์ง ์๋๋ค.
์์ ๊ด๊ณ์ ์๋ ํด๋์ค ๊ฐ์ ๊ฐ์ ์ด๋ฆ์ ํจ์๋ฅผ ์ ์ํ๋ ๊ฒ์ผ๋ก์, ๊ธฐ๋ณธ ํด๋์ค์์ ์ ์ธ๋ ํจ์์ ๊ฐ์ ์ด๋ฆ์ ํจ์๊ฐ ํ์ ํด๋์ค์์ ์ฌ์ ์๋์ด ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ ์ค๋ฒ๋ผ์ด๋ ๋์๋ค๊ณ ํ๋ค.
- ์ค๋ฒ๋ผ์ด๋ ํ๊ณ ์ ํ๋ ํจ์๊ฐ ๊ธฐ๋ณธ ํด๋์ค์ ์กด์ฌํด์ผ ํ๋ค.
- ํจ์ ์ด๋ฆ์ด ๊ฐ์์ผ ํ๋ค.
- ๋งค๊ฐ๋ณ์์ ๊ฐ์ ๋ฐ ์๋ฃํ, ๋ฐํํ์ด ๋์ผํด์ผ ํ๋ค.
- ํด๋์ค ๊ณ์ธต ๊ตฌ์กฐ์์์ ๋ค์ํ ๊ฐ์ฒด๋ค์ ๋ํด์, ๋ง์น ๊ฐ์ฒด๋ค์ด ๊ธฐ๋ฐ ํด๋์ค์ ๊ฐ์ฒด์ธ ๊ฒ์ฒ๋ผ ์ฒ๋ฆฌ
- ์ด ๋, ๊ฐ ๊ฐ์ฒด๋ ์์ ์๊ฒ ์ ํฉํ ์์
์ ์ํ
- ์ฆ, ์๋ก ๋ค๋ฅธ ํ์ ๊ฐ์ฒด๋ ์๋ก ๋ค๋ฅธ ์์ ์ ์ํ
- ๊ธฐ์กด์ ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ์๋ก์ด ํด๋์ค๋ฅผ ์ถ๊ฐํ ์ ์๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์
๋์ ๋ฐ์ธ๋ฉ Dynamic binding =Late binding =Runtime binding
- 10๊ฐ์ ์ ์ ์์๋ฅผ ๊ฐ๋ ๋ฐฐ์ด์ ํ ๋น
int* gradesArray = new int[10];
- ๋์ ํ ๋น ๋ฐฐ์ด์ ํฌ๊ธฐ
- ํ๋ก๊ทธ๋จ ๋ด์์ ์ ์ ๋ณ์๋ ์ ์ ๋ณ์์ ์์ ํํ์ ํตํด ๋ํ๋ผ ์ ์์
int* gradesArray = new int[count1+count2];
- Animal ๊ธฐ๋ณธ ํด๋์ค์ ๋ชจ๋ ํ์ ํด๋์ค (Fish, Frog, Bird)๋ move ํจ์๋ฅผ ๊ฐ๋๋ค.
- ์๋ก ๋ค๋ฅธ ํ์ ํด๋์ค ๊ฐ์ฒด ํฌ์ธํฐ๋ค์ Animal* ํ์ ํธ๋ค์ ์ ์ฅ
- ํ๋ก๊ทธ๋จ์ ๊ฐ์ ๋ฉ์์ง๋ฅผ (์: move) ๊ฐ Animal ๊ฐ์ฒด์ ์ ๋ฌํ๋ค. ์ฆ, ํธ๋ค๋ก move ํจ์ ํธ์ถ
- ์ด ๋, ๊ฐ ๊ฐ์ฒด๋ ์์ ์๊ฒ ์ ๋นํ ํจ์๋ฅผ ํธ์ถํ๋ค.
- Fish ๋ ์์ํ๋ฉฐ move๋ฅผ ์ํ
- Frog ๋ ์ ํํ๋ฉฐ move๋ฅผ ์ํ
- Bird ๋ ๋ ์๊ฐ๋ฉฐ move๋ฅผ ์ํ
- ํธ๋ค์ ๊ตฌ์ฒด์ ์ธ ์ด๋ค ๋์์ ์ ๊ทผํ๊ธฐ ์ํ ์ฉ๋๋ก ์ฐ์ด๋ ๋งค๊ฐ์ฒด์ด๋ค.
- ํธ๋ค๋ก์ ๋ ํผ๋ฐ์ค ๋ณ์์ ํฌ์ธํฐ ๋ณ์, ๋ฐ๋ณต์๊ฐ ์ฌ๊ธฐ์ ํด๋นํ๋ค.
- Derived class ๊ฐ์ฒด๋ฅผ base class์ ํฌ์ธํฐ/์ฐธ์กฐํ ํธ๋ค๋ก ๋ฐ์
- Base class์์ ๊ฐ์(virtual) ํจ์๋ก ์ ์ธ๋ ํจ์๋ฅผ ์คํ์ํฌ ๋ ๋์
-
c++๋ ๊ฐ์ฒด๋ฅผ ์ค์ ๋ก ์์ฑํ ํด๋์ค (์ฆ, derived class)์ ํจ์๋ฅผ ์คํ์ํค๊ฒ ๋จ
-
ํธ๋ค(handle)์ ์๋ฃํ(์ฆ, base class)์ ํจ์๊ฐ ์๋
-
-> virtual function์ ์ด์ฉํ์ฌ ๋์ ๋ฉ์ปค๋์ฆ์ ๊ตฌํ ๊ฐ๋ฅ
- Base class์ ํฌ์ธํฐ ํธ๋ค์ด base class์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ฉด
- ํธ๋ค์ ์๋ฃํ๊ณผ ์ค์ ๊ฐ์ฒด์ ์๋ฃํ์ด ๊ฐ์
- ํธ๋ค ์๋ฃํ์ ํจ์๋ฅผ ํธ์ถ -> base class ํจ์ ํธ์ถ
- Derived class์ ํฌ์ธํฐ ํธ๋ค์ด derived class์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ฉด
- ํธ๋ค์ ์๋ฃํ๊ณผ ์ค์ ๊ฐ์ฒด์ ์๋ฃํ์ด ๊ฐ์
- ํธ๋ค ์๋ฃํ์ ํจ์๋ฅผ ํธ์ถ -> derived class ํจ์ ํธ์ถ
- Base class์ ํฌ์ธํฐ ํธ๋ค์ด derived class์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ฉด
- ํธ๋ค์ base class์ ํฌ์ธํฐ, ์ค์ ๊ฐ์ฒด๋ ํ์ ํด๋์ค์ ๊ฐ์ฒด์
- ํธ๋ค ์๋ฃํ์ ํจ์๋ฅผ ํธ์ถ -> base class ํจ์ ํธ์ถ
- virtual ํจ์๋ฅผ ์ฌ์ฉํ์ง ์์ ๋ (w/o using polymorphism)
- ํจ์์ ํธ์ถ์ ๊ฐ์ฒด์ ํธ๋ค(handle)์ ์๋ฃํ์ ์ํด์ ๊ฒฐ์ ๋จ
- ์์ฑ๋ ๊ฐ์ฒด์ ์ค์ ์๋ฃํ์ด ์๋
- virtual ํจ์๋ฅผ ์ด์ฉํ ๋ (using polymorphism)
- (ํธ๋ค์ ์๋ฃํ์ด ์๋) ์ค์ ๊ฐ์ฒด์ ์๋ฃํ์ด ํธ์ถํ ๊ฐ์ํจ์๋ฅผ ๊ฒฐ์ ํ๊ฒ ๋๋ค.
- c++์์ ๊ฐ์ฒด์งํฅ ์ค๊ณ์ ๋คํ์ฑ(polymorphism) ๊ตฌํ์ ๋ฐฉ๋ฒ์
#ifndef COMMISSIONEMPLOYEE_H
#define COMMISSIONEMPLOYEE_H
#include <string>
using namespace std;
class CommissionEmployee
{
public:
CommissionEmployee(const string &, const string &, const string &,
double = 0.0, double = 0.0);
void setFirstName(const string &);
string getFirstName() const;
void setLastName(const string &);
string getLastName() const;
void setSocialSecurityNumber(const string &);
string getSocialSecurityNumber() const;
void setGrossSales(double);
double getGrossSales() const;
void setCommissionRate(double);
double getCommissionRate() const;
double earnings() const;
void print() const;
private:
string firstName;
string lastName;
string socialSecurityNumber;
double grossSales;
double commissionRate;
};
#endif
#include "CommissionEmployee.h"
#include <iostream>
#include <string>
using namespace std;
CommissionEmployee::CommissionEmployee(const string &first, const string &last, const string &ssn, double sales, double rate)
{
firstName = first;
lastName = last;
socialSecurityNumber = ssn;
setGrossSales(sales);
setCommissionRate(rate);
}
double CommissionEmployee::earnings() const
{
return commissionRate * grossSales;
}
double CommissionEmployee::getCommissionRate() const
{
return commissionRate;
}
string CommissionEmployee::getFirstName() const
{
return firstName;
}
double CommissionEmployee::getGrossSales() const
{
return grossSales;
}
string CommissionEmployee::getLastName() const
{
return lastName;
}
string CommissionEmployee::getSocialSecurityNumber() const
{
return socialSecurityNumber;
}
void CommissionEmployee::print() const
{
cout << "commission employee: "
<< getFirstName() << ' ' << getLastName() << endl
<< "social security number: " << getSocialSecurityNumber() << endl
<< "gross sales: " << getGrossSales() << endl
<< "commission rate: " << getCommissionRate() << endl;
}
void CommissionEmployee::setCommissionRate(double rate)
{
commissionRate = (rate > 0.0 && rate < 1.0) ? rate : 0;
}
void CommissionEmployee::setFirstName(const string &first)
{
firstName = first;
}
void CommissionEmployee::setGrossSales(double sales)
{
grossSales = sales < 0.0 ? 0 : sales;
}
void CommissionEmployee::setLastName(const string &last)
{
lastName = last;
}
void CommissionEmployee::setSocialSecurityNumber(const string &ssn)
{
socialSecurityNumber = ssn;
}
#ifndef BASEPLUSCOMMISSIONEMPLOYEE_H
#define BASEPLUSCOMMISSIONEMPLOYEE_H
#include <string>
#include "CommissionEmployee.h"
using namespace std;
class BasePlusCommissionEmployee : public CommissionEmployee
{
private:
double baseSalary;
public:
BasePlusCommissionEmployee(const string &, const string &, const string &,
double = 0.0, double = 0.0, double = 0.0);
void setBaseSalary(double);
double getBaseSalary() const;
void print() const;
double earnings() const;
};
#endif
#include "BasePlusCommissionEmployee.h"
#include <iostream>
#include <string>
#include "CommissionEmployee.h"
using namespace std;
BasePlusCommissionEmployee::BasePlusCommissionEmployee(const string &first, const string &last, const string &ssn, double sales, double rate, double salary)
: CommissionEmployee(first, last, ssn, sales, rate)
{
setBaseSalary(salary);
}
double BasePlusCommissionEmployee::earnings() const
{
return getBaseSalary() + CommissionEmployee::earnings();
}
double BasePlusCommissionEmployee::getBaseSalary() const
{
return baseSalary;
}
void BasePlusCommissionEmployee::print() const
{
cout << "base-salaried ";
CommissionEmployee::print();
cout << "base salary: " << baseSalary << endl;
}
void BasePlusCommissionEmployee::setBaseSalary(double salary)
{
baseSalary = salary < 0.0 ? 0 : salary;
}
- C++ ์ปดํ์ผ๋ฌ์์ ์๋ฌ ์์ฑ
- CommissionEmployee (๊ธฐ๋ณธ ํด๋์ค ๊ฐ์ฒด) is not a BasePlusCommissionEmployee (ํ์ ํด๋์ค ๊ฐ์ฒด)
- ๋ง์ฝ ์ด๊ฒ์ด ํ์ฉ๋๋ค๋ฉด, ํ๋ก๊ทธ๋๋จธ๋ ์กด์ฌํ์ง ์๋ ํ์ ํด๋์ค์ ๋ฉค๋ฒ์ ์ ๊ทผํ ๊ฒ์ด๋ค.
- ์ ํ ์๋ฑํ ๋ฐ์ดํฐ์ ์ฌ์ฉ๋๋ ๋ฉ๋ชจ๋ฆฌ ๋ด์ฉ์ ๋ณ๊ฒฝํ๋ ์ค๋ฅ๊ฐ ๋ฐ์ ๊ฐ๋ฅ
#include "CommissionEmployee.h"
#include "BasePlusCommissionEmployee.h"
int main()
{
CommissionEmployee commissionEmployee(
"Sue", "Jones", "222-22-2222", 10000, .06);
BasePlusCommissionEmployee *basePlusCommissionEmployeePtr = 0;
// aim derived-class pointer at base-class object
// Error: a CommissionEmployee is not a BasePlusCommissionEmployee
basePlusCommissionEmployeePtr = &commissionEmployee;
return 0;
}
- ๊ธฐ๋ณธ ํด๋์ค์ ์กด์ฌํ๋ ํจ์๋ฅผ ํธ์ถํ๋ฉด ๊ธฐ๋ณธ ํด๋์ค์ ๊ธฐ๋ฅ์ด ์ํ
- ํ์ ํด๋์ค์๋ง ์กด์ฌํ๋ ํจ์๋ฅผ ํธ์ถํ๋ฉด ์ปดํ์ผ ์๋ฌ ๋ฐ์
- ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ ํด๋์ค์ ๋ฉค๋ฒ๋ ๊ธฐ๋ณธ ํด๋์ค์ ๊ฐ์ฒด ํฌ์ธํฐ๋ก๋ถํฐ ์ ๊ทผํ ์ ์๋ค.
- ์ต์ง๋ก downcasting์ ์ด์ฉํ๋ฉด ๊ฐ๋ฅ
- ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ (w/o virtual function)
- ํธ๋ค(handle)์ด ์ด๋ ํ ํด๋์ค ํจ์๋ฅผ ํธ์ถํ ์ง ๊ฒฐ์ ํ๋ค.
- ๊ฐ์ ํจ์ ์ฌ์ฉ์ ๊ฒฝ์ฐ
- ํธ๋ค์ ์๋ฃํ์ด ์๋, ๊ฐ๋ฆฌํค๊ณ ์๋ ๊ฐ์ฒด์ ์ค์ ์๋ฃํ์ด ๊ฐ์ ํจ์์ ์ด๋ค ๊ตฌํ์ ์ฌ์ฉํ ์ง ๊ฒฐ์ ํ๊ฒ ๋๋ค.
- ํ๋ก๊ทธ๋จ์ด ๋์ ์ผ๋ก (์ปดํ์ผ ์๊ฐ์ด ์๋ ์คํ์๊ฐ์) ์ด๋ค ํด๋์ค์ ํจ์๋ฅผ ์ฌ์ฉํ ์ง ๊ฒฐ์ ํ๋ค.
- ๋์ ๋ฐ์ธ๋ฉ (dynamic binding) ์ด๋ผ๊ณ ํจ
- ๊ธฐ๋ณธ ํด๋์ค ์ ์ธ์์
virtual
ํค์๋๋ฅผ ํจ์ ์ํ ์์ ๋ถ์์ผ๋ก์จ ๊ฐ์ํจ์๋ฅผ ์ ์ธ- ์)
virtual void print()
- ์)
- ํ์ ํด๋์ค๋ ๊ธฐ๋ณธ ํด๋์ค์ ๊ฐ์ ํจ์๋ฅผ override ํ๋ค.
- ๊ธฐ๋ณธ ํด๋์ค์ ๊ฐ์ ํจ์๋, ๋ชจ๋ ๊ณ์ธต์ ํ์ ํด๋์ค์์ ์ญ์ virtual ํจ์์ด๋ค
ํน์ ๊ฐ์ฒด๊ฐ dot operator๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉค๋ฒ ํจ์๋ฅผ ํธ์ถํ๋ฉด, virtual ์ฌ๋ถ์ ๊ด๊ณ์์ด ํธ์ถ๋ ํจ์๋ (ํธ๋ค์ ์ํด) ์ปดํ์ผ ์๊ฐ์ ๊ฒฐ์ ๋๋ค.
๊ฐ์ํจ์์ ๋์ ๋ฐ์ธ๋ฉ์ ํฌ์ธํฐ ๋๋ ์ฐธ์กฐํ์ ํธ๋ค์์๋ง ์ด๋ฃจ์ด์ง๋ค.
#ifndef COMMISSION_EMPLOYEE_H
#define COMMISSION_EMPLOYEE_H
#include <string>
using namespace std;
class CommissionEmployee
{
public:
CommissionEmployee(const string &, const string &, const string &,
double = 0.0, double = 0.0);
void setFirstName(const string &);
string getFirstName() const;
void setLastName(const string &);
string getLastName() const;
void setSocialSecurityNumber(const string &);
string getSocialSecurityNumber() const;
void setGrossSales(double);
double getGrossSales() const;
void setCommissionRate(double);
double getCommissionRate() const;
virtual double earnings() const;
virtual void print() const;
private:
// protected:
string firstName;
string lastName;
string socialSecurityNumber;
double grossSales;
double commissionRate;
};
#endif
#include <iostream>
using std::cout;
#include "CommissionEmployee.h"
CommissionEmployee::CommissionEmployee(
const string &first, const string &last, const string &ssn,
double sales, double rate)
{
firstName = first;
lastName = last;
socialSecurityNumber = ssn;
setGrossSales(sales);
setCommissionRate(rate);
}
void CommissionEmployee::setFirstName(const string &first)
{
firstName = first;
}
string CommissionEmployee::getFirstName() const
{
return firstName;
}
void CommissionEmployee::setLastName(const string &last)
{
lastName = last;
}
string CommissionEmployee::getLastName() const
{
return lastName;
}
void CommissionEmployee::setSocialSecurityNumber(const string &ssn)
{
socialSecurityNumber = ssn;
}
string CommissionEmployee::getSocialSecurityNumber() const
{
return socialSecurityNumber;
}
void CommissionEmployee::setGrossSales(double sales)
{
grossSales = (sales < 0.0) ? 0.0 : sales;
}
double CommissionEmployee::getGrossSales() const
{
return grossSales;
}
void CommissionEmployee::setCommissionRate(double rate)
{
commissionRate = (rate > 0.0 && rate < 1.0) ? rate : 0.0;
}
double CommissionEmployee::getCommissionRate() const
{
return commissionRate;
}
double CommissionEmployee::earnings() const
{
return commissionRate * grossSales;
}
void CommissionEmployee::print() const
{
cout << "commission employee: " << firstName << ' ' << lastName
<< "\nsocial security number: " << socialSecurityNumber
<< "\ngross sales: " << grossSales
<< "\ncommission rate: " << commissionRate;
}
#ifndef BASE_PLUS_COMMISSION_EMPLOYEE_H
#define BASE_PLUS_COMMISSION_EMPLOYEE_H
#include <string>
#include "CommissionEmployee.h"
using namespace std;
class BasePlusCommissionEmployee : public CommissionEmployee
{
public:
BasePlusCommissionEmployee(const string &, const string &, const string &,
double = 0.0, double = 0.0, double = 0.0);
void setBaseSalary(double);
double getBaseSalary() const;
virtual double earnings() const;
virtual void print() const;
private:
double baseSalary;
};
#endif
#include <iostream>
using std::cout;
#include "BasePlusCommissionEmployee.h"
BasePlusCommissionEmployee::BasePlusCommissionEmployee(
const string &first, const string &last, const string &ssn,
double sales, double rate, double salary)
: CommissionEmployee(first, last, ssn, sales, rate)
{
setBaseSalary(salary);
}
void BasePlusCommissionEmployee::setBaseSalary(double salary)
{
baseSalary = (salary < 0.0) ? 0.0 : salary;
}
double BasePlusCommissionEmployee::getBaseSalary() const
{
return baseSalary;
}
double BasePlusCommissionEmployee::earnings() const
{
// double tempCommissionRate = getCommissionRate();
// double tempGrossSales = getGrossSales();
// return baseSalary + (tempCommissionRate * tempGrossSales);
return baseSalary + (getCommissionRate() * getGrossSales());
}
void BasePlusCommissionEmployee::print() const
{
cout << "base-salaried commission emplyee: " << getFirstName() << ' '
<< getLastName() << "\nsocial security number: " << getSocialSecurityNumber()
<< "\ngross sales: " << getGrossSales()
<< "\ncommission rate: " << getCommissionRate()
<< "\nbase salary: " << baseSalary;
}
#include <iostream>
#include <iomanip>
#include "BasePlusCommissionEmployee.h"
#include "CommissionEmployee.h"
using namespace std;
int main()
{
CommissionEmployee commissionEmployee(
"Sue", "Jones", "222-22-2222", 10000, 0.6);
CommissionEmployee *commissionEmployeePtr = 0;
BasePlusCommissionEmployee basePlusCommissionEmployee(
"Bob", "Lewis", "333-33-3333", 5000, 0.04, 300);
BasePlusCommissionEmployee *basePlusCommissionEmployeePtr = 0;
cout << fixed << setprecision(2);
cout << "Invoking print function on base-class and derived-class "
<< "\nobjects with static binding\n\n";
commissionEmployee.print();
cout << "\n\n";
basePlusCommissionEmployee.print();
cout << "\n\n\nInvoking print function on base-class and "
<< "derived-class \nobjects with dynamic binding:";
commissionEmployeePtr = &commissionEmployee;
cout << "\n\nCalling virtual function print with base-class pointer"
<< "\n to base-class object invokes base-class "
<< "print function:\n\n";
commissionEmployeePtr->print();
basePlusCommissionEmployeePtr = &basePlusCommissionEmployee;
cout << "\n\nCalling virtual function print with derived-class "
<< "pointer\nto derived-class object invokes derived-class "
<< "print function:\n\n";
basePlusCommissionEmployeePtr->print();
commissionEmployeePtr = &basePlusCommissionEmployee;
cout << "\n\nCalling virtual function print with base-class pointer "
<< "\nto derived-class object invokes derived-class "
<< "print function:\n\n";
commissionEmployeePtr->print();
cout << endl;
return 0;
}
- Client๊ฐ ์ค์ ๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๋ (๋ถ์์ ํ) ํด๋์ค
- ํ์ ํด๋์ค๋ค์ ๊ณตํต์ ์ด๊ณ ์ถ์์ ์ธ ํน์ง๋ง ์ ์ํจ
- -> ํ์ ํด๋์ค๊ฐ โ๋น ์ง ๋ถ๋ถ๏ผ์ ์ ์ํด์ผ ํ๋ค.
- ์ค์ ๊ฐ์ฒด๋ฅผ ์ ์ ํ๊ธฐ์ ๋๋ฌด ํฌ๊ด์ ์ด๋ค.
- ํ์ ํด๋์ค๋ค์ ๊ณตํต์ ์ด๊ณ ์ถ์์ ์ธ ํน์ง๋ง ์ ์ํจ
- ์ผ๋ฐ์ ์ผ๋ก ๊ธฐ๋ณธ ํด๋์ค๋ก ์ฌ์ฉ๋๋ฉฐ, ์ถ์ ๊ธฐ๋ณธ ํด๋์ค (abstract base class)๋ผ๊ณ ๋ถ๋ฆฐ๋ค.
- ๋ค๋ฅธ ํด๋์ค, ์ฆ ๊ตฌ์ฒด์ ์ธ ํ์ ํด๋์ค (concrete class)์ ์์๋ ์ ์๋ ์ ํฉํ ๊ธฐ๋ณธ ํด๋์ค๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ์กด์ฌ
- Pure virtual function์ ์ฌ์ฉํ๋ฉด ๊ทธ ํด๋์ค๋ ์ถ์ ํด๋์ค๊ฐ ๋จ
Virtual void draw() const =0;
- ํจ์ ๊ตฌํ์ ์ ๊ณตํ์ง ์๋๋ค. (์ ์์ ์ ๊ฐ์ ์ํ๋ง ์กด์ฌ)
- ๋ชจ๋ ๊ตฌ์ฒด ํ์ ํด๋์ค๋ ๊ธฐ๋ณธ ํด๋์ค์ ๋ชจ๋ pure virtual function์ ์ฌ์ ์(override)ํ๊ณ ๊ตฌ์ฒด์ ๊ตฌํ์ ์ ๊ณตํด์ผ ํจ
- -> ๊ทธ๋ ์ง ์์ผ๋ฉด ํ์ ํด๋์ค ๋ํ ์ถ์ ํด๋์ค๊ฐ ๋๋ค.
- ๋ชจ๋ ๊ตฌ์ฒด ํ์ ํด๋์ค๋ ๊ธฐ๋ณธ ํด๋์ค์ ๋ชจ๋ pure virtual function์ ์ฌ์ ์(override)ํ๊ณ ๊ตฌ์ฒด์ ๊ตฌํ์ ์ ๊ณตํด์ผ ํจ
- ๊ธฐ๋ณธ ํด๋์ค์์ ๋ฉค๋ฒ ํจ์๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด ๋ฌด์๋ฏธํ ๋ ์ฌ์ฉ๋จ
- ์ค์ ๊ตฌํ์ ๊ตฌ์ฒดํ๋ ํ์ ํด๋์ค์์ ์ด๋ฃจ์ด ์ง
- ํฌ์ธํฐ ๋๋ ์ฐธ์กฐํ ๊ฐ์ฒด๋ฅผ ์ ์ธํ์ฌ (์ฆ, ๊ฐ์ฒด ์์ฑ ์ด์ด ํธ๋ค๋ง ์์ฑ) ์ถ์ ๊ธฐ๋ณธ ํด๋์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- ํ์๋ ์ด๋ ํ ๊ตฌ์ฒด ํด๋์ค์ ๊ฐ์ฒด๋ผ๋ ๊ฐ๋ฆฌํฌ ์ ์์
- ํ๋ก๊ทธ๋จ์ ์ผ๋ฐ์ ์ผ๋ก ์ด๋ฌํ ํฌ์ธํฐ๋ ์ฐธ์กฐํ์ ์ด์ฉํ์ฌ ํ์ ํด๋์ค ๊ฐ์ฒด์ ๋คํ์ฑ์ ์ด์ฉํ ์ ์๋ค.
- ๋คํ์ฑ์ ๊ณ์ธตํ๋ ์ํํธ์จ์ด ์์คํ
์ ๊ตฌํ์ ํนํ ํจ์จ์
- ์) ์ฌ๋ฌ ๋ค๋ฅธ ์ฅ์น(device)์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ธ ๋
- ์ถ์ ํด๋์ค๋ ๊ณตํต์ ์ธ ์ธํฐํ์ด์ค๋ฅผ pure virtual function์ผ๋ก ์ ๊ณตํ๊ณ , ์ค์ ์ ์ถ๋ ฅ์ ํ์ ํด๋์ค์์ ์ฌ์ ์ํ ํจ์๊ฐ ๋ด๋น
- ์) ์ฌ๋ฌ ๋ค๋ฅธ ์ฅ์น(device)์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ธ ๋
- ์ถ์ ํด๋์ค Employee๋ ์ผ๋ฐ์ ์ธ โ์ข
์
์โ์ ํน์ง์ ํํ
- ๊ณ์ธต ๊ตฌ์กฐ์ โinterfaceโ๋ฅผ ์ ์ธ
- ๊ฐ ์ข
์
์์ ๊ณตํต ์์ฑ ์ ์ธ
- -> first name, last name, social security number
- ์์ (earnings)์ ๊ณ์ฐ ๋ฐฉ๋ฒ ๋ฐ ๊ฐ์ฒด ์ ๋ณด์ ์ถ๋ ฅ ๋ฐฉ๋ฒ์ ๊ตฌ์ฒด ํ์ ํด๋์ค ๋ง๋ค ๋ชจ๋ ๋ค๋ฆ