C Programming Language/C++

C++ μ—…μΊμŠ€νŒ…, λ‹€ν˜•μ„±, 닀쀑 상속과 가상 상속, 가상 ν•¨μˆ˜

567Rabbit 2024. 9. 4. 13:59

 

 

C++ Inheritance(상속), 상속과 μ˜€λ²„λ‘œλ”© (using ν‚€μ›Œλ“œ)

Inheritance(상속) - C++μ—μ„œ μƒμ†μ˜ μš©μ–΄  base class (superclass : λΆ€λͺ¨ 클래슀)derived class (subclass : μžμ‹ 클래슀)  ex) Person이 base class 이고, studentκ°€ derived class이닀. μœ„μ—μ„œμ™€ 같이 ν‘œμ‹œν•˜λ©΄ 상속을 λ°›λŠ”

codebunny99.tistory.com

 

μ—…μΊμŠ€νŒ…(Upcasting)μ΄λž€?

μ—…μΊμŠ€νŒ…(Upcasting)은 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°(OOP)μ—μ„œ νŒŒμƒ 클래슀(μžμ‹ 클래슀)의 객체λ₯Ό κΈ°λ³Έ 클래슀(λΆ€λͺ¨ 클래슀) νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€. 이 λ³€ν™˜μ€ μ•”μ‹œμ μœΌλ‘œ(λͺ…μ‹œμ μΈ μΊμŠ€νŒ… μ—°μ‚° 없이) 이루어지며, 상속 관계에 μžˆλŠ” ν΄λž˜μŠ€λ“€ μ‚¬μ΄μ—μ„œ 자주 μ‚¬μš©λœλ‹€.

 

 

 

μ—…μΊμŠ€νŒ…μ˜ νŠΉμ§•:

 

Is-A 관계:

- μ—…μΊμŠ€νŒ…μ€ "Is-A" 관계에 κΈ°λ°˜ν•œλ‹€. 즉, νŒŒμƒ ν΄λž˜μŠ€λŠ” κΈ°λ³Έ 클래슀의 일쒅이기 λ•Œλ¬Έμ—, νŒŒμƒ 클래슀 객체λ₯Ό κΈ°λ³Έ 클래슀 νƒ€μž…μœΌλ‘œ λ‹€λ£¨λŠ” 것이 κ°€λŠ₯ν•˜λ‹€.

- 예λ₯Ό λ“€μ–΄, StudentλŠ” Person의 μΌμ’…μ΄λ―€λ‘œ, Student 객체λ₯Ό Person νƒ€μž…μœΌλ‘œ μ—…μΊμŠ€νŒ…ν•  수 μžˆλ‹€.

 

μ•”μ‹œμ  λ³€ν™˜:

C++μ—μ„œλŠ” νŒŒμƒ 클래슀의 객체λ₯Ό κΈ°λ³Έ 클래슀의 객체둜 λ‹€λ£° λ•Œ, λ³„λ„μ˜ μΊμŠ€νŒ… μ—°μ‚°μž 없이 μžλ™μœΌλ‘œ μ—…μΊμŠ€νŒ…μ΄ κ°€λŠ₯ν•˜λ‹€. 이 κ³Όμ •μ—μ„œ μ»΄νŒŒμΌλŸ¬λŠ” νŒŒμƒ 클래슀 객체λ₯Ό κΈ°λ³Έ 클래슀 객체둜 μ²˜λ¦¬ν•¨

 

κΈ°λ³Έ 클래슀 λ©€λ²„μ—λ§Œ μ ‘κ·Ό κ°€λŠ₯:

μ—…μΊμŠ€νŒ…λœ κ°μ²΄λŠ” κΈ°λ³Έ 클래슀의 λ©€λ²„μ—λ§Œ μ ‘κ·Όν•  수 μžˆλ‹€. νŒŒμƒ ν΄λž˜μŠ€μ—μ„œ μΆ”κ°€λ˜κ±°λ‚˜ μž¬μ •μ˜λœ 멀버 ν•¨μˆ˜λ‚˜ λ³€μˆ˜μ—λŠ” μ ‘κ·Όν•  수 μ—†λ‹€.

 

class Person {
public:
    void introduce() {
        std::cout << "I am a person." << std::endl;
    }
};

class Student : public Person {
public:
    void introduce() {
        std::cout << "I am a student." << std::endl;
    }
    void study() {
        std::cout << "I am studying." << std::endl;
    }
};

int main() {
    Student s;          // Student 객체 생성
    Person* p = &s;     // Student 객체λ₯Ό Person ν¬μΈν„°λ‘œ μ—…μΊμŠ€νŒ…

    p->introduce();     // "I am a person." 호좜 (Person 클래슀의 introduce 호좜)
    // p->study();      // 였λ₯˜! Person ν΄λž˜μŠ€μ—λŠ” study() ν•¨μˆ˜κ°€ μ—†μŒ

    return 0;
}
  1. Person* p = &s;:
    • Student 객체 sλ₯Ό Person νƒ€μž… 포인터 p둜 μ—…μΊμŠ€νŒ…. μ΄λ•Œ λ³„λ„μ˜ μΊμŠ€νŒ… μ—°μ‚°μžκ°€ ν•„μš”ν•˜μ§€ μ•Šλ‹€.
  2. p->introduce();:
    • pλŠ” Person νƒ€μž…μ˜ 포인터이기 λ•Œλ¬Έμ—, introduce() 호좜 μ‹œ Person ν΄λž˜μŠ€μ— μ •μ˜λœ introduce() ν•¨μˆ˜κ°€ 호좜됨
    • λ‹€ν˜•μ„±(polymorphism)을 μ§€μ›ν•˜λŠ” 가상 ν•¨μˆ˜(virtual function)κ°€ μ•„λ‹Œ 경우, κΈ°λ³Έ 클래슀의 ν•¨μˆ˜κ°€ 호좜
  3. p->study();:
    • 이 μ½”λ“œλŠ” 컴파일 였λ₯˜λ₯Ό μΌμœΌν‚΄. pλŠ” Person νƒ€μž…μ˜ 포인터이기 λ•Œλ¬Έμ— Person ν΄λž˜μŠ€μ— μ •μ˜λ˜μ§€ μ•Šμ€ study() ν•¨μˆ˜μ—λŠ” μ ‘κ·Όν•  수 μ—†λ‹€.

 

 

μ—…μΊμŠ€νŒ…μ˜ ν™œμš©:

  • λ‹€ν˜•μ„±(Polymorphism): μ—…μΊμŠ€νŒ…μ€ λ‹€ν˜•μ„±μ˜ 기초λ₯Ό μ œκ³΅ν•œλ‹€. κΈ°λ³Έ 클래슀의 ν¬μΈν„°λ‚˜ μ°Έμ‘°λ₯Ό μ‚¬μš©ν•΄ νŒŒμƒ 클래슀 객체λ₯Ό μ²˜λ¦¬ν•˜λ©΄, λ‚˜μ€‘μ— λŸ°νƒ€μž„ μ‹œμ— μ •ν™•ν•œ νŒŒμƒ 클래슀의 객체가 μ–΄λ–€ 것인지λ₯Ό μ•Œ 수 있게 λœλ‹€.
  • μ½”λ“œμ˜ μœ μ—°μ„±: μ½”λ“œκ°€ 더 μœ μ—°ν•΄μ§€κ³  μž¬μ‚¬μš©μ„±μ΄ 높아진닀. λ‹€μ–‘ν•œ νŒŒμƒ 클래슀λ₯Ό 같은 κΈ°λ³Έ 클래슀 νƒ€μž…μœΌλ‘œ μ²˜λ¦¬ν•  수 있기 λ•Œλ¬Έμ—, ν•¨μˆ˜λ‚˜ λ©”μ„œλ“œλ₯Ό μž‘μ„±ν•  λ•Œ λ‹€μ–‘ν•œ νƒ€μž…μ˜ 객체λ₯Ό λ‹€λ£° 수 μžˆλ‹€.

 

 

 

μ—…μΊμŠ€νŒ…μ˜ ν•œκ³„:

 

- μΆ”κ°€λœ 멀버에 λŒ€ν•œ μ ‘κ·Ό μ œν•œ: μ—…μΊμŠ€νŒ…λœ κ°μ²΄λŠ” κΈ°λ³Έ ν΄λž˜μŠ€μ— μ •μ˜λœ λ©€λ²„μ—λ§Œ μ ‘κ·Όν•  수 있으며, νŒŒμƒ ν΄λž˜μŠ€μ— μΆ”κ°€λœ 멀버(λ³€μˆ˜, ν•¨μˆ˜)μ—λŠ” μ ‘κ·Όν•  수 μ—†λ‹€.

 

- λ‹€ν˜•μ„± 미적용: 가상 ν•¨μˆ˜κ°€ μ•„λ‹Œ 멀버 ν•¨μˆ˜μ˜ 경우, κΈ°λ³Έ 클래슀의 ν•¨μˆ˜κ°€ 호좜되며, νŒŒμƒ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜λœ ν•¨μˆ˜λŠ” ν˜ΈμΆœλ˜μ§€ μ•ŠλŠ”λ‹€.

 

 

 

 

λ‹€ν˜•μ„± (Polymorphism)

λ‹€ν˜•μ„±μ€ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°(OOP)의 핡심 κ°œλ… 쀑 ν•˜λ‚˜λ‘œ, 같은 μ΄λ¦„μ˜ ν•¨μˆ˜κ°€ 객체의 νƒ€μž…μ— 따라 λ‹€λ₯΄κ²Œ λ™μž‘ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€.

 

λ‹€ν˜•μ„±μ΄λž€ νŠΉμ •ν•œ ν•¨μˆ˜(예: getArea())λ₯Ό ν˜ΈμΆœν•  λ•Œ, κ·Έ ν•¨μˆ˜κ°€ 호좜된 객체의 νƒ€μž…μ— 따라 μ„œλ‘œ λ‹€λ₯Έ ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜λŠ” 것을 μ˜λ―Έν•œλ‹€. 예λ₯Ό λ“€μ–΄, getArea()λΌλŠ” λ™μΌν•œ μ΄λ¦„μ˜ ν•¨μˆ˜κ°€ Triangle(μ‚Όκ°ν˜•), Rectangle(μ‚¬κ°ν˜•), Circle(원) κ°μ²΄μ—μ„œ 각각 λ‹€λ₯΄κ²Œ κ΅¬ν˜„λ  수 μžˆλ‹€λŠ” 것을 톡해 λ‹€ν˜•μ„±μ„ μ„€λͺ…ν•  수 μžˆλ‹€.

 

 

 

λ‹€ν˜•μ„±μ˜ νŠΉμ§•

  • 동적 바인딩: λ‹€ν˜•μ„±μ—μ„œλŠ” μ‹€μ œ ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜κ°€ λŸ°νƒ€μž„(ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λŠ” λ™μ•ˆ)에 κ²°μ •λœλ‹€. 이λ₯Ό 동적 바인딩(dynamic binding)이라고 ν•œλ‹€. λ™μ λ°”μΈλ”©μ΄λž€ μ‹€ν–‰ 쀑 기본클래슀의 μ°Έμ‘°λ‚˜ ν¬μΈν„°λ‘œ 가상 ν•¨μˆ˜κ°€ 호좜되면, νŒŒμƒ 클래슀 객체의 μ˜€λ²„λΌμ΄λ”©λœ 가상 ν•¨μˆ˜λ₯Ό λ™μ μœΌλ‘œ μ°Ύμ•„μ„œ ν˜ΈμΆœν•˜λŠ” 것을 λ§ν•œλ‹€.
  • μ½”λ“œμ˜ μœ μ—°μ„±: λ‹€ν˜•μ„±μ€ 같은 μΈν„°νŽ˜μ΄μŠ€(ν•¨μˆ˜ 이름)λ₯Ό 톡해 λ‹€μ–‘ν•œ 객체λ₯Ό λ‹€λ£° 수 있게 ν•΄μ€€λ‹€. 이둜 인해 μ½”λ“œκ°€ 더 μœ μ—°ν•΄μ§€κ³  μœ μ§€λ³΄μˆ˜κ°€ μ‰¬μ›Œμ§„λ‹€
  • λ‹€ν˜•μ„±μ˜ ν™œμš©: λ‹€μ–‘ν•œ ν˜•νƒœμ˜ 객체가 μžˆμ„ λ•Œ, λ™μΌν•œ λ°©μ‹μœΌλ‘œ λ‹€λ£° 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, λ„ν˜• 클래슀의 λ°°μ—΄μ—μ„œ 각각의 λ„ν˜• 면적을 계산할 λ•Œ, λ„ν˜•μ˜ νƒ€μž…μ— 따라 μ μ ˆν•œ getArea() ν•¨μˆ˜κ°€ ν˜ΈμΆœλœλ‹€.

 

 

λ‹€μŒκ³Ό 같이 ν˜ΈμΆœλ˜λŠ” 것이 λ‹€ν˜•μ„±μ˜ μž₯점이닀.

 

 

<μ°Έκ³ >

λ‹€ν˜•μ„± 클래슀(Polymorphism)λž€ ν•˜λ‚˜ μ΄μƒμ˜ 가상 ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•˜λŠ” 클래슀λ₯Ό λ§ν•œλ‹€.

 

 

 
 
 

닀쀑 상속(Multiple Inheritance) : 닀이아λͺ¬λ“œ ν˜•νƒœ

 
 

 

 
 
 

두 클래슀 λͺ¨λ‘ 같은 print() ν•¨μˆ˜κ°€ μžˆλ‹€λ©΄, λΆ€λͺ¨ 클래슀 쀑 μ–΄λŠ μͺ½μ˜ ν•¨μˆ˜λ₯Ό μ“Έ 것인지 μ •ν™•νžˆ ν‘œν˜„ν•˜μ—¬μ•Ό μ—λŸ¬κ°€ λ‚˜μ§€ μ•ŠλŠ”λ‹€. μ—λŸ¬κ°€ λ‚˜μ§€ μ•ŠκΈ° μœ„ν•΄μ„œ Student::print();, Teacher::print(); 처럼 λͺ…μ‹œν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.

 

 

 

 

 

 

가상 κΈ°λ³Έ 클래슀(Virtual Base Class)와 가상 상속(Virtual Inheritance)

 

 

닀이아λͺ¬λ“œ 상속 문제(Diamond Problem)와 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ 가상 κΈ°λ³Έ 클래슀(Virtual Base Class)에 λŒ€ν•΄ μ•Œμ•„λ³΄μž.

μ•„λž˜μ˜ μ˜ˆμ‹œλŠ”  C++μ—μ„œ 닀쀑 상속을 μ‚¬μš©ν•˜λŠ” 경우 λ°œμƒν•  수 μžˆλŠ” ꡬ쑰적 문제λ₯Ό μ„€λͺ…ν•˜λ©°, 가상 상속(Virtual Inheritance)을 μ‚¬μš©ν•΄ 이λ₯Ό ν•΄κ²°ν•˜λŠ” 방법을 보여쀀닀.

 

 

닀이아λͺ¬λ“œ ν˜•νƒœ: 상속 ꡬ쑰λ₯Ό 보면 Person ν΄λž˜μŠ€κ°€ 두 번 μƒμ†λ˜μ–΄, TA ν΄λž˜μŠ€μ—μ„œ Person 클래슀의 두 개의 볡사본을 κ°€μ§€κ²Œ 됨. μ΄λŸ¬ν•œ 닀쀑 상속 κ΅¬μ‘°μ—μ„œ, TA ν΄λž˜μŠ€λŠ” Person 클래슀λ₯Ό 두 번 μƒμ†λ°›κ²Œ λ˜λŠ”λ°, 이둜 인해 TA 클래슀 λ‚΄μ—μ„œ Person 클래슀의 멀버가 μ€‘λ³΅μœΌλ‘œ μ‘΄μž¬ν•˜κ²Œ λœλ‹€

 

문제점:

TA ν΄λž˜μŠ€μ—μ„œ Person 클래슀의 멀버에 μ ‘κ·Όν•  λ•Œ, μ–΄λ–€ Person 클래슀λ₯Ό 참쑰할지 μ• λ§€ν•΄μ§€λŠ” λ¬Έμ œκ°€ λ°œμƒ

예λ₯Ό λ“€μ–΄, TA κ°μ²΄μ—μ„œ Person 클래슀의 멀버λ₯Ό ν˜ΈμΆœν•˜λ©΄ Studentλ‘œλΆ€ν„° μƒμ†λœ Person의 멀버인지, Teacherλ‘œλΆ€ν„° μƒμ†λœ Person의 멀버인지 λͺ¨ν˜Έν•˜λ‹€

 

 

 

문제 ν•΄κ²° : 가상 상속 (Virtual Inheritance)

 

 

가상 μƒμ†μ˜ 적용:

Student와 Teacher ν΄λž˜μŠ€κ°€ Person 클래슀λ₯Ό 상속할 λ•Œ virtual ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 가상 상속을 적용

이둜 인해 Student와 Teacher ν΄λž˜μŠ€λŠ” Person 클래슀의 단일 μΈμŠ€ν„΄μŠ€λ₯Ό κ³΅μœ ν•˜κ²Œ λœλ‹€.

 

κ²°κ³Ό:

- TA ν΄λž˜μŠ€λŠ” 이제 Person 클래슀의 볡사본을 ν•˜λ‚˜λ§Œ κ°€μ§€κ²Œ λœλ‹€

- TA ν΄λž˜μŠ€μ—μ„œ Person 클래슀의 멀버에 μ ‘κ·Όν•  λ•Œ, Student와 Teacher λ‘˜ 쀑 μ–΄λŠ μͺ½μ„ 톡해 μ ‘κ·Όν•˜λ”λΌλ„ λ™μΌν•œ Person의 멀버에 μ ‘κ·Όν•˜κ²Œ λœλ‹€

- μ΄λ ‡κ²Œ ν•¨μœΌλ‘œμ¨ 닀이아λͺ¬λ“œ 상속 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€.

 

 

 

상황:

Person ν΄λž˜μŠ€μ— print() ν•¨μˆ˜κ°€ μ •μ˜λ˜μ–΄ 있고, Student와 Teacher ν΄λž˜μŠ€μ—μ„œ print() ν•¨μˆ˜κ°€ μž¬μ •μ˜(μ˜€λ²„λΌμ΄λ”©)λœλ‹€.

TA ν΄λž˜μŠ€μ—μ„œ print() ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ, Student와 Teacher 클래슀의 print() ν•¨μˆ˜κ°€ 호좜되며, 각각의 ν•¨μˆ˜ λ‚΄μ—μ„œ Person 클래슀의 print()λ₯Ό ν˜ΈμΆœν•œλ‹€.

 

문제 λ°œμƒ: TA ν΄λž˜μŠ€μ—μ„œ print() ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ Person::print()κ°€ 두 번 ν˜ΈμΆœλ˜λŠ” λ¬Έμ œκ°€ λ°œμƒ. μ΄λŠ” Student::print()와 Teacher::print() κ°κ°μ—μ„œ Person::print()λ₯Ό ν˜ΈμΆœν•˜κΈ° λ•Œλ¬Έ

 

ν•΄κ²° 방법: 가상 상속을 μ‚¬μš©ν•˜μ—¬ Person 클래슀λ₯Ό 가상 κΈ°λ³Έ 클래슀둜 λ§Œλ“€λ©΄, TA ν΄λž˜μŠ€μ—λŠ” Person 클래슀의 단일 μΈμŠ€ν„΄μŠ€λ§Œ μ‘΄μž¬ν•˜κ²Œ λ˜μ–΄ Person::print()κ°€ 두 번 ν˜ΈμΆœλ˜λŠ” λ¬Έμ œκ°€ ν•΄κ²°λœλ‹€.

 

 

 

가상 ν•¨μˆ˜μ™€ ν‚€μ›Œλ“œ μ‚¬μš©

  • 가상 ν•¨μˆ˜(Virtual Function)λŠ” 클래슀의 λ‹€ν˜•μ„±(Polymorphism)을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€.
  • virtualoverridefinal ν‚€μ›Œλ“œλŠ” 가상 ν•¨μˆ˜μ™€ κ΄€λ ¨λœ λͺ…μ‹œμ μΈ 정보λ₯Ό μ œκ³΅ν•œλ‹€.
    • virtual: λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ 가상 ν•¨μˆ˜λ‘œ μ„ μ–Έλœ ν•¨μˆ˜λ₯Ό μ˜λ―Έν•˜λ©°, νŒŒμƒ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜(override)될 수 μžˆμŠ΅λ‹ˆλ‹€.
    • override: λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ μ •μ˜λœ 가상 ν•¨μˆ˜λ₯Ό μž¬μ •μ˜ν•˜κ³  μžˆλ‹€λŠ” 것을 λͺ…μ‹œμ μœΌλ‘œ λ‚˜νƒ€λƒ„. μ΄λŠ” μ‹€μˆ˜λ₯Ό 쀄이고, μ½”λ“œμ˜ λͺ…확성을 높인닀
    • final: 이 ν•¨μˆ˜κ°€ 더 이상 ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜λ˜μ§€ μ•Šλ„λ‘ ν•  λ•Œ μ‚¬μš©ν•¨. 이둜 인해 클래슀의 λ™μž‘μ΄ ν™•μ‹€νžˆ κ³ μ •λ˜λ©°, μ˜λ„ν•˜μ§€ μ•Šμ€ μ˜€λ²„λΌμ΄λ”©μ„ λ°©μ§€ν•œλ‹€
    • 가상 ν•¨μˆ˜ μ„ μ–Έμ—μ„œ 이듀 쀑 ν•˜λ‚˜λ§Œ λͺ…μ‹œν•˜λŠ” 것이 λ°”λžŒμ§ν•˜λ‹€. μ΄λŠ” μ½”λ“œμ˜ λ‹¨μˆœμ„±κ³Ό λͺ…확성을 높이며, λΆˆν•„μš”ν•œ 쀑볡을 ν”Όν•  수 μžˆλ‹€.

이λ₯Ό 톡해 2가지 였λ₯˜λ₯Ό μ œκ±°ν•  수 μžˆλ‹€ : implicit virtual, implicit override

 

 

 

 

가상 μ†Œλ©Έμž(Virtual Destructor)

 

가상 μ†Œλ©Έμž(Virtual Destructor)λŠ” 가상 ν•¨μˆ˜κ°€ μžˆλŠ” ν΄λž˜μŠ€μ—μ„œ μ€‘μš”ν•˜λ‹€ κΈ°λ³Έ(Base) 클래슀의 포인터λ₯Ό 톡해 νŒŒμƒ 클래슀 객체λ₯Ό μ‚­μ œν•  λ•Œ, νŒŒμƒ 클래슀의 μ†Œλ©Έμžκ°€ ν˜ΈμΆœλ˜μ§€ μ•ŠμœΌλ©΄ λ¦¬μ†ŒμŠ€ λˆ„μˆ˜κ°€ λ°œμƒν•  수 있기 λ•Œλ¬Έμ—, μ†Œλ©ΈμžλŠ” κ°€μƒμœΌλ‘œ μ„ μ–Έλ˜μ–΄μ•Ό ν•œλ‹€. μ΄λŠ” delete μ—°μ‚°μžκ°€ κΈ°λ³Έ 클래슀의 ν¬μΈν„°λ‘œ 호좜될 λ•Œ, μ˜¬λ°”λ₯Έ νŒŒμƒ 클래슀의 μ†Œλ©Έμžκ°€ ν˜ΈμΆœλ˜λ„λ‘ 보μž₯ν•œλ‹€.

  • 가상 μ†Œλ©ΈμžλŠ” 주둜 public λ˜λŠ” protected둜 μ„ μ–Έλœλ‹€
  • Public 가상 μ†Œλ©ΈμžλŠ” 클래슀 μ™ΈλΆ€μ—μ„œ 객체λ₯Ό μ•ˆμ „ν•˜κ²Œ μ‚­μ œν•  수 있게 ν•΄μ€€λ‹€
  • Protected 가상 μ†Œλ©ΈμžλŠ” 클래슀의 μ™ΈλΆ€μ—μ„œ 직접 객체λ₯Ό μ‚­μ œν•  수 없도둝 μ œν•œν•˜μ§€λ§Œ, νŒŒμƒ 클래슀 λ‚΄λΆ€μ—μ„œλŠ” μ•ˆμ „ν•˜κ²Œ μ‚­μ œκ°€ κ°€λŠ₯ν•˜λ‹€

 

 

 

<μ°Έκ³  : JAVA 클래슀의 λͺ¨λ“  λ©”μ„œλ“œλŠ” virtual ν΄λž˜μŠ€μ΄λ‹€. 즉 JAVAμ—μ„œλŠ” ν•¨μˆ˜ μž¬μ •μ˜λŠ” 곧 μ˜€λ²„λΌμ΄λ”©μ΄λ‹€>