"

Cpp - μ˜€λ²„λ‘œλ”©, μ˜€λ²„λΌμ΄λ”©, 가상 ν•¨μˆ˜

2022. 5. 6. 12:19ㆍC++



πŸ’‘ μ˜€λ²„λ‘œλ”©, μ˜€λ²„λΌμ΄λ”©, 가상 ν•¨μˆ˜, 가상 μ†Œλ©Έμž

μ˜€λ²„λ‘œλ”©(overloading)κ³Ό μ˜€λ²„λΌμ΄λ”©(overriding), 가상 ν•¨μˆ˜, 가상 μ†Œλ©Έμž

μ˜€λ²„λΌμ΄λ”© : 주둜 μƒμ†μ—μ„œ 쓰이며, λ™μΌν•œ ν•¨μˆ˜λͺ…에 λŒ€ν•΄ μ›λž˜ κΈ°λŠ₯을 λ¬΄μ‹œν•˜κ³  μƒˆλ‘­κ²Œ μž¬μ •μ˜ν•˜λŠ” 것.

μ˜€λ²„λ‘œλ”© : λ™μΌν•œ ν•¨μˆ˜λͺ…을 κ°€μ§„ ν•¨μˆ˜λ₯Ό λ§€κ°œλ³€μˆ˜λ₯Ό 달리 ν•΄ μ—¬λŸ¬κ°œλ‘œ μ •μ˜ν•˜λŠ” 것.

μ˜€λ²„λ‘œλ”©κ³Ό μ˜€λ²„λΌμ΄λ”©μ€ ν—·κ°ˆλ¦¬κΈ° 쉽닀. ν‘œλ‘œ μ •λ¦¬ν•΄λ³΄μž

μ˜€λ²„λ‘œλ”©(overloading) μ˜€λ²„λΌμ΄λ”©(overriding)
λ§€κ°œλ³€μˆ˜ λ³€κ²½ λ³€κ²½ X ν•¨μˆ˜ μ›ν˜• μœ μ§€λ™
λ™μž‘ κΈ°λŠ₯ κΈ°λŠ₯ μœ μ§€ κΈ°λŠ₯ λ³€κ²½ λ˜λŠ” ν™•μž₯

μ˜€λ²„λ‘œλ”© μ‹œ ν•¨μˆ˜μ˜ κΈ°λŠ₯을 변경해도 λ˜μ§€λ§Œ, 주둜 λ™μΌν•œ κΈ°λŠ₯을 λ‹€μ–‘ν•œ 인자λ₯Ό λ°›μ•„λ“€μ—¬ μ“°κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” κ²½μš°κ°€ λŒ€λΆ€λΆ„.


멀버 ν•¨μˆ˜ μ˜€λ²„λΌμ΄λ”©

상속을 톡해 물렀받은 멀버 ν•¨μˆ˜λ₯Ό μ˜€λ²„λΌμ΄λ”©μ„ 톡해 μž¬μ •μ˜ν•  것이닀.

  1. μžμ‹ ν΄λž˜μŠ€μ—μ„œ 직접 μ˜€λ²„λΌμ΄λ”©
  2. virtual ν•¨μˆ˜(가상 ν•¨μˆ˜)λ₯Ό μ΄μš©ν•˜μ—¬ μ˜€λ²„λΌμ΄λ”©

1. μžμ‹ ν΄λž˜μŠ€μ—μ„œ 직접 μ˜€λ²„λΌμ΄λ”©

#include <iostream>

class Person {
    private:
            std::string name;
    public:
            Person(std::string n) : name(n) {};
            void printInfo() {
                std::cout << "name : " << name << std::endl;
            }
};

class Student: public Person {
    private:
            int stu_num; 
    public:
        Student(std::string n, int sn) : Person(n), stu_num(sn) {};
        void printInfo() {
            Person::printInfo();
            std::cout << "studnet number : " << stu_num << std::endl;
        }
};

int main() {
    Student sujilee("sujilee", 14);

    sujilee.printInfo();
    std::cout << std::endl;
    sujilee.Person::printInfo();
}

Person에 μ •μ˜λœ ν•¨μˆ˜ printInfo()와 λ™μΌν•œ μ›ν˜•μ„ μ§€λ‹ˆκ³ , κΈ°λŠ₯뢀뢄을 ν•™λ²ˆκΉŒμ§€ 좜λ ₯ν•˜λ„λ‘ μž¬μ •μ˜ ν–ˆμŒ.

//OUTPUT

name : sujilee
studnet number : 14

name : sujilee

2. virtual ν•¨μˆ˜λ₯Ό μ΄μš©ν•œ μ˜€λ²„λΌμ΄λ”©

  • virtual ν•¨μˆ˜λ₯Ό μ΄μš”ν•œ μ˜€λ²„λΌμ΄λ”©μ€ μ–Έμ œ ν•„μš”ν• κΉŒ?

μœ„μ˜ μ½”λ“œμ—μ„œ main문을 쑰금 λ°”κΏ”λ³΄μž.

int main() {
    Person *pointedPerson;
    Person kchoi("kchoi");
    Student sujilee("sujilee", 14);

    pointedPerson = &kchoi;
    pointedPerson->printInfo();

  std::cout << std::endl;

    pointedPerson = &sujilee;
    pointedPerson->printInfo();
}

클래슀 포인터 λ³€μˆ˜λ₯Ό μƒμ„±ν–ˆλ‹€. 포인터 λ³€μˆ˜μ— Student 클래슀의 객체λ₯Ό μ°Έμ‘°ν•˜κ²Œ ν•˜λ©΄ Student 클래슀의 μ˜€λ²„λΌμ΄λ”© 된 printInfo()κ°€ μ•„λ‹ˆλΌ Person 클래슀의 printInfo()κ°€ ν˜ΈμΆœλ˜λŠ” 것을 좜λ ₯κ²°κ³Όμ—μ„œ 확인할 수 μžˆλ‹€.

name : kchoi

name : sujilee

클래슀 포인터 λ³€μˆ˜λŠ” ν•΄λ‹Ή λ³€μˆ˜μ˜ νƒ€μž…μ— ν•΄λ‹Ήν•˜λŠ” 클래슀의 λ©€λ²„λ§Œ ν˜ΈμΆœν•  수 μžˆλ‹€.


μœ„μ™€ 같은 경우λ₯Ό ν•΄κ²°ν•˜λŠ” 방법이 λ°”λ‘œ virtual ν•¨μˆ˜ (가상 ν•¨μˆ˜)λ₯Ό μ΄μš©ν•œ μ˜€λ²„λΌμ΄λ”©μ΄λ‹€.

#include <iostream>

class Person {
    private:
            std::string name;
    public:
            Person(std::string n) : name(n) {};
            virtual void printInfo() {
                std::cout << "name : " << name << std::endl;
            }
};

class Student: public Person {
    private:
            int stu_num; 
    public:
        Student(std::string n, int sn) : Person(n), stu_num(sn) {};
        virtual void printInfo() {
            Person::printInfo();
            std::cout << "studnet number : " << stu_num << std::endl;
        }
};

int main() {
    Person *pointedPerson;
    Person kchoi("kchoi");
    Student sujilee("sujilee", 14);

    pointedPerson = &kchoi;
    pointedPerson->printInfo();

  std::cout << std::endl;

    pointedPerson = &sujilee;
    pointedPerson->printInfo();
}

ν•¨μˆ˜ νƒ€μž…μ— virtual ν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬μ£Όμ—ˆλ‹€.

name : kchoi

name : sujilee
studnet number : 14

virtaul을 μ΄μš©ν•˜μ—¬ ν•¨μˆ˜λ₯Ό 가상 ν•¨μˆ˜λ‘œ μ„ μ–Έν•˜λ©΄, 포인터 λ³€μˆ˜μ˜ νƒ€μž…(25λ²ˆμ§Έμ€„μ˜ Person)이 μ•„λ‹Œ 포인터가 μ‹€μ œλ‘œ λ‹΄κ³ μžˆλŠ” 객체(34λ²ˆμ§Έμ€„μ˜ sujilee)의 μ£Όμ†Œμ— 따라 ν˜ΈμΆœν•˜λŠ” λŒ€μƒμ„ λ°”κΏ€ 수 μžˆλ‹€.

κ°€μƒν•¨μˆ˜μ— κ΄€λ ¨ν•΄ μ•Œμ•„μ•Όν•  동적 바인딩(dynamic binding)κ³Ό 가상 μ†Œλ©Έμž(virtual destrucor)에 λŒ€ν•΄μ„œλŠ” λ‹€μŒ κ²Œμ‹œλ¬Όμ—μ„œ 닀루도둝 ν•˜κ² λ‹€.