μμ: is-a κ΄κ³
c++λ μμμ 3κ°μ§ νμμΌλ‘ public, protected, privateλ₯Ό κ°μ§κ³ μλ€. public μμμ is-a κ΄κ³λ₯Ό λνλΈλ€. (νμ ν΄λμ€ κ°μ²΄κ° κΈ°μ΄ ν΄λμ€ κ°μ²΄μ΄κΈ°λ ν¨) κΈ°μ΄ ν΄λμ€ κ°μ²΄λ₯Ό λμμΌλ‘ μνν μ μλ λͺ¨λ μμ μ, νμ ν΄λμ€ κ°μ²΄μ λν΄μλ μν κ°λ₯
public λ€ν μμ
public λ€ν μμμ ꡬννλ λ κ°μ§ μ€μν λ°©λ²μ΄ μλ€.
- κΈ°μ΄ ν΄λμ€ λ©μλλ₯Ό νμ ν΄λμ€μμ λ€μ μ μνλ€.
- κ°μ λ©μλλ₯Ό μ¬μ©νλ€.
virtual ν€μλλ λ©μλκ° κ°μ²΄μ μν΄ νΈμΆλμ§ μκ³ μ°Έμ‘°λ ν¬μΈν°μ μν΄ νΈμΆλμμ λ μ΄λ λ©μλλ₯Ό μ¬μ©ν κ²μΈμ§ κ²°μ νλ€. virtual ν€μλλ₯Ό μ¬μ©νμ κ²½μ°μ, νλ‘κ·Έλ¨μ μ°Έμ‘°λ ν¬μΈν°μ μν΄ μ§μλλ κ°μ²΄νμ κΈ°μ΄νμ¬ λ©μλλ₯Ό μ ννλ€.
κ°μ λ©μλλ μ νμν κΉ?
νκ΄΄μλ€μ΄ κ°μμ΄ μλλΌλ©΄, ν¬μΈν°νμ ν΄λΉνλ νκ΄΄μλ§ νΈμΆλ κ²μ΄λ€. νκ΄΄μκ° κ°μμ΄λ©΄, κ°μ²΄νμ ν΄λΉνλ νκ΄΄μκ° νΈμΆλλ€.
μ μ κ²°ν©κ³Ό λμ κ²°ν©
μμ€ μ½λμ μλ ν¨μ νΈμΆμ νΉμ λΈλ‘μ μλ ν¨μ μ½λλ₯Ό μ€ννλΌλ λ»μΌλ‘ ν΄μνλ κ²μ "ν¨μ μ΄λ¦μ κ²°ν©(binding)νλ€"λΌκ³ λ§ν¨. μ»΄νμΌνλ λμμ μΌμ΄λλ κ²°ν©μ μ μ κ²°ν© λλ μ΄κΈ° κ²°ν©μ΄λΌ νλ€. μ»΄νμΌλ¬λ νλ‘κ·Έλ¨μ μ€νν λ μ¬λ°λ₯Έ κ°μ λ©μλκ° μ νλλλ‘ νλ μ½λλ₯Ό λ§λ€μ΄ λ΄μΌ νλ€. μ΄ μμ μ λμ κ²°ν© λλ λ§κΈ° κ²°ν©μ΄λΌ νλ€.
ν¬μΈν°μ μ°Έμ‘°νμ νΈν
νμ ν΄λμ€ μ°Έμ‘°λ ν¬μΈν°λ₯Ό κΈ°μ΄ ν΄λμ€ μ°Έμ‘°λ ν¬μΈν°λ‘ λ³ννλ κ²μ μ μΊμ€ν (upcasting)μ΄λΌ νλ€. public μμμμλ λͺ μμ μΈ λ°μ΄ν°ν λ³νμ΄ μμ΄λ μ μΊμ€ν μ΄ μΈμ λ μ§ νμ©λλ€.
κ·Έ λ°λ κ³Όμ , κΈ°μ΄ ν΄λμ€ ν¬μΈν°λ μ°Έμ‘°λ₯Ό νμ ν΄λμ€ ν¬μΈν°λ μ°Έμ‘°λ‘ λ³ννλ κ²μ λ€μ΄ μΊμ€ν μ΄λΌ νλ€. λ€μ΄ μΊμ€ν μ λͺ μμ μΈ λ°μ΄ν°ν λ³ν μμ΄λ νμ©λμ§ μλλ€.
κ°μ λ©€λ² ν¨μμ λμ κ²°ν©
λ€μκ³Ό κ°μ μ½λλ₯Ό κ°μ§κ³ μλ€κ³ κ°μ νμ.
BrassPlus ophelia; //νμ ν΄λμ€ κ°μ²΄
Brass *bp; //κΈ°μ΄ ν΄λμ€ ν¬μΈν°
bp = &ophelia; //BrassPlus κ°μ²΄λ₯Ό μ§μνλ Brass ν¬μΈν°
bp->ViewAcct(); //μ΄λ λ²μ μ νΈμΆν κΉ?
ViewAcct()λ₯Ό κΈ°μ΄ ν΄λμ€μ κ°μμΌλ‘ μ μΈνμ§ μμΌλ©΄, bp->ViewAcct()λ Brass* νμ ν¬μΈν°μ κΈ°μ΄νμ¬ Brass::ViewAcct()λ₯Ό νΈμΆ νλ€. μ»΄νμΌλ¬λ κ°μμ΄ μλ ν¨μλ€μ λν΄μ μ μ κ²°ν©μ μ¬μ©νλ€.
ViewAcct()λ₯Ό κΈ°μ΄ ν΄λμ€μ κ°μμΌλ‘ μ μΈνλ©΄, bp->ViewAcct()λ BrassPlus κ°μ²΄μ κΈ°μ΄νμ¬ BrassPlus::ViewAcct()λ₯Ό νΈμΆνλ€. μ΄ μμμλ κ·Έ κ°μ²΄νμ΄ BrassPlusμ΄λ€. νλ‘κ·Έλ¨μ΄ μ€νλλ λμμ κ²°μ λλ κ°μ²΄νμ λ°λΌ ViewAcct()λ₯Ό Brass::ViewAcct()μ κ²°ν©νκ±°λ λλ BrassPlus::ViewAcct()μ κ²°ν©νλ μ½λλ₯Ό μ»΄νμΌλ¬κ° λ§λ€μ΄λΈλ€. μ»΄νμΌλ¬λ κ°μ ν¨μλ€μ λν΄ λμ κ²°ν©μ μ¬μ©νλ€.
κ°μ ν¨μλ₯Ό μ¬μ©νλ©΄ λ©λͺ¨λ¦¬μ μ€ν μλ λ©΄μμ λ€μκ³Ό κ°μ μ½κ°μ λΆλ΄μ΄ λ°λ₯Έλ€.
- κ° κ°μ²΄μ ν¬κΈ°κ° μ£Όμ νλλ₯Ό μ μ₯νλλ° νμν μ λ§νΌ 컀μ§λ€.
- κ°κ°μ ν΄λμ€μ λν΄, μ»΄νμΌλ¬λ κ°μ ν¨μλ€μ μ£Όμλ‘ μ΄λ£¨μ΄μ§ νλμ ν μ΄λΈ(λ°°μ΄)μ λ§λ λ€.
- κ°κ°μ ν¨μ νΈμΆμ λν΄, μ€νν ν¨μμ μ£Όμλ₯Ό μ»κΈ° μν΄ ν μ΄λΈμ μ κ·Όνλ κ² μΈμ λ¨κ³κ° λ νμνλ€.
κ°μ λ©μλμ λν΄ μμμΌν μ¬ν
- κΈ°μ΄ ν΄λμ€μμ ν΄λμ€ λ©μλλ₯Ό μ μΈν λ ν€μλ virtualλ‘ μμνλ©΄, κ·Έ ν¨μλ κΈ°μ΄ ν΄λμ€, κΈ°μ΄ ν΄λμ€μμ νμλ ν΄λμ€, νμ ν΄λμ€μμ λ€μ νμλ ν΄λμ€ λ± λͺ¨λ ν΄λμ€μ λν΄ κ°μμ΄ λλ€.
- κ°μ²΄μ λν μ°Έμ‘°λ₯Ό μ¬μ©νμ¬ λλ κ°μ²΄λ₯Ό μ§μνλ ν¬μΈν°λ₯Ό μ¬μ©νμ¬ κ°μ λ©μλκ° νΈμΆλλ©΄, νλ‘κ·Έλ¨μ κ·Έ μ°Έμ‘°λ ν¬μΈν°νμ μν΄ μ μλ λ©μλλ₯Ό μ¬μ©νμ§ μκ³ , κ°μ²΄νμ μν΄ μ μλ λ©μλλ₯Ό μ¬μ©νλ€. μ΄κ²μ λμ κ²°ν©μ΄λΌ ν¨.
- μμμ μν΄ κΈ°μ΄ ν΄λμ€λ‘ μ¬μ©ν ν΄λμ€λ₯Ό μ μν λ, νμ ν΄λμ€μμ λ€μ μ μν΄μΌ νλ ν΄λμ€ λ©μλλ€μ κ°μ ν¨μλ‘ μ μΈν΄μΌ νλ€.
μμ±μ
μμ±μλ κ°μμΌλ‘ μ μΈν μ μλ€.
νκ΄΄μ
ν΄λμ€κ° κΈ°μ΄ ν΄λμ€λ‘ μ¬μ©λλ€λ©΄, νκ΄΄μλ κ°μμΌλ‘ μ μΈν΄μΌ νλ€.
νλ λ
νλ λλ κ°μ ν¨μκ° λ μ μλ€.
κ°μ ν¨μλ₯Ό λ€μ μ μνμ§ μμΌλ©΄ νμ ν΄λμ€λ κ·Έ ν¨μμ κΈ°μ΄ ν΄λμ€ λ²μ μ μ¬μ©νλ€. νμ ν΄λμ€κ° κΈΈκ² μ΄μ΄μ§ νμ μ¬μ¬μ μΌλΆλΌλ©΄, κ·Έ νμ ν΄λμ€λ κ·Έ ν¨μμ κ°μ₯ μ΅κ·Όμ μ μλ λ²μ μ μ¬μ©νλ€.
κ°μ ν¨μλ₯Ό λ€μ μ μνλ©΄ λ©μλκ° μλλλ€.
class Dwelling
{
public:
virtual void showperks(int a) const;
...
};
class Hovel: public Dwelling
{
public:
virtual void showperks() const;
...
}
μ μ½λλ λ€μκ³Ό κ°μ κ²μ μμν¨.
Hovel trump;
trump.showperks(); //λ§λ€
trump.showperks(5); //ν리λ€
μλ‘μ΄ μ μλ λ§€κ° λ³μλ₯Ό μ¬μ©νμ§ μλ showperks()ν¨μλ₯Ό μ μνκ³ , μ΄κ²μ μ€λ² λ‘λ©λ λ κ°μ ν¨μ λ²μ μ μμ±νμ§ μλλ€. μ΄ μ¬μ μλ intν 맀κ°λ³μλ₯Ό μ¬μ©νλ κΈ°μ΄ ν΄λμ€ λ²μ μ κ°μ§λ€. μ¦ μμλ λ©μλλ₯Ό λ€μ μ μνλ κ²μ μ€λ² λ‘λ©μ λ³μ’ μ΄ μλλ€. μ΄λ€ ν¨μλ₯Ό νμ ν΄λμ€μμ λ€μ μ μνλ©΄, λμΌν ν¨μ μκ·Έλ΄μ²λ₯Ό κ°μ§κ³ μλ κΈ°μ΄ ν΄λμ€ μ μΈλ§ κ°λ¦¬λ κ²μ΄ μλλΌ. λ§€κ° λ³μ μκ·Έλ΄μ²μλ μκ΄μμ΄ κ°μ μ΄λ¦μ κ°μ§ λͺ¨λ κΈ°μ΄ ν΄λμ€ λ©μλλ€μ κ°μ§.
μμλ λ©μλλ₯Ό μ¬μ μ ν κ²½μ° μ€λ¦¬μ§λ μνκ³Ό μ νν μΌμΉμν¬ νμκ° μλ€. 리ν΄νμ΄ κΈ°μ΄ ν΄λμ€μ λν μ°Έμ‘°λ ν¬μΈν°μΈ κ²½μ°μ νμ ν΄λμ€μ λν μ°Έμ‘°λ ν¬μΈν°λ‘ λ체 κ°λ₯νλ€. μ΄ κΈ°λ₯μ 리ν΄νμ 곡λ³μ΄λΌ νλ€.
κΈ°μ΄ ν΄λμ€ μ μΈμ΄ μ€λ²λ‘λ©λμλ€λ©΄, νμ ν΄λμ€μμ λͺ¨λ κΈ°μ΄ ν΄λμ€ λ²μ λ€μ μ¬μ μ ν΄μΌ νλ€.
μ κ·Όμ μ΄: protected
publicκ³Ό private μΈμ ν€μλ protectedλ₯Ό μ¬μ©νλ μ κ·Ό μ μ΄κ° ν κ°μ§ λ μλ€.
λ°κΉ₯ μΈκ³μμ protected λΆλΆμ μλ ν΄λμ€ λ©€λ²μ μ κ·ΌνκΈ° μν΄μλ public ν΄λμ€ λ©€λ²λ₯Ό μ¬μ©ν΄μΌλ§ νλ€λ μ μμ protected ν€μλλ privateμ λΉμ·νλ€.
protectedμ privateμ μ°¨μ΄λ, νμ ν΄λμ€μ λ©€λ²λ€μ κΈ°μ΄ ν΄λμ€μ protected λ©€λ²μλ μ§μ μ κ·Όν μ μμ§λ§, κΈ°μ΄ ν΄λμ€μ private λ©€λ²μλ μ§μ μ κ·Όν μ μλ€.
μΆμν κΈ°μ΄ ν΄λμ€(abstract base class;ABC)
μ μ΄λ νλμ μμ κ°μ ν¨μλ₯Ό μ¬μ©νλ μΈν°νμ΄μ€λ₯Ό μμ νλ€. ABCλ‘λΆν° νμλ ν΄λμ€λ€μ μΌλ° κ°μ ν¨μλ₯Ό μ¬μ©νλ©°, κ·Έ νΉλ³ν νμ ν΄λμ€μ μμ±μ κ°μ§κ³ κ·Έ μΈν°νμ΄μ€λ₯Ό ꡬννλ€.
μμ κ°μ ν¨μ: ꡬνλμ§ μμ ν¨μ, ν¨μ μ μΈ λ€μ =0μ κ°μ§λ€.
ABC μ² ν
μΆμν ν΄λμ€λ₯Ό μ€κ³νκΈ° μ μ, νλ‘κ·Έλλ° λ¬Έμ λ₯Ό νννλλ° νμν ν΄λμ€λ€μ μ΄λ€ κ²λ€μ΄ μμκΉ κ·Έλ¦¬κ³ κ·Έ ν΄λμ€λ€μ μ΄λ€ μ°κ΄μ΄ μμκΉλ₯Ό λ¨Όμ μκ°νμ¬ νλμ λͺ¨λΈμ κ°λ°ν΄μΌ νλ€. μΌλΆ νλ‘κ·Έλλ¨Έλ€μ, ν΄λμ€λ€μ μμ 체κ³λ₯Ό μ€κ³ν λ, ꡬ체ν ν΄λμ€λ€μ κΈ°μ΄ ν΄λμ€ μν μ μ λ νμ§ λͺ»νκ² λ§λ€μ΄μΌ νλ€κ³ μ£Όμ₯νλ€. μ΄λ κ² νλ©΄ μ€κ³κ° λ 볡μ‘νκ³ λ κΉ¨λν μ½λκ° λ§λ€μ΄μ§λ€.
μμκ³Ό λμ λ©λͺ¨λ¦¬ λμ
κ²½μ° 1 - νμ ν΄λμ€κ° newλ₯Ό μ¬μ©νμ§ μλλ€.
λμ λ©λͺ¨λ¦¬ λμ μ μ¬μ©νλ λ€μκ³Ό κ°μ κΈ°μ΄ ν΄λμ€ κ°μ .
class baseDMA
{
private:
char *label;
int rating;
public:
baseDMA(const char *1 = "null",int r=0);
baseDMA(const baseDMA &rs);
virtual ~baseDMA();
baseDMA& operator=(const baseDMA & rs);
...
};
μ΄ μ μΈμ, μμ±μκ° newλ₯Ό μ¬μ©ν λ μꡬλλ νΉλ³ν λ©μλλ€(νκ΄΄μ, λ³΅μ¬ μμ±μ, μ€λ² λ‘λ© λμ μ°μ°μ)λ₯Ό κ°μ§κ³ μλ€. baseDMAλ‘λΆν° lacksDMAλ₯Ό νμμν€λλ°, lacksDMAλ newλ₯Ό μ¬μ©νμ§ μκ³ λ€λ₯Έ νΉλ³ν μ²λ¦¬λ μꡬνμ§ μλλ€κ³ κ°μ ν΄ λ³΄μ.
class lacksDMA: public baseDMA
{
private:
char color[40];
public:
...
};
μ΄λ¬ν κ²½μ°, lacksDMA ν΄λμ€λ₯Ό μν΄ λͺ μμ νκ΄΄μ, λ³΅μ¬ μμ±μ, λμ μ°μ°μλ₯Ό μ μν νμ X
κ²½μ° 2 - νμ ν΄λμ€κ° newλ₯Ό μ¬μ©νλ€.
νμ ν΄λμ€κ° newλ₯Ό μ¬μ©νλ€κ³ κ°μ
class hasDMA: public baseDMA
{
private:
char * style; // μμ±μμμ newλ₯Ό μ¬μ©νλ€.
public:
...
};
μ΄ κ²½μ°, νμ ν΄λμ€λ₯Ό μν λͺ μμ νκ΄΄μ, λ³΅μ¬ μμ±μ, λμ μ°μ°μλ₯Ό λΉμ°ν μ μν΄μΌ νλ€.
μμ½νλ©΄, κΈ°μ΄ ν΄λμ€μ νμ ν΄λμ€κ° λ λ€ λμ λ©λͺ¨λ¦¬ λμ , νμ ν΄λμ€ νκ΄΄μ, λ³΅μ¬ μμ±μ, λμ μ°μ°μλ₯Ό μ¬μ©ν λ, μ΄λ€μ λͺ¨λ κΈ°μ΄ ν΄λμ€ μ±λΆμ μ²λ¦¬νκΈ° μν΄ κ·Έλ€μ κΈ°μ΄ ν΄λμ€ λμλ¬Όμ μ¬μ©ν΄μΌ νλ€.