Inherence
์ ์ฒด์ ์ธ ๊ตฌ์กฐ
์์์ด ํ์ํ ์ด์
์์์ ๋งค์ฐ ์ ์ฉํ๋ค. 13. Class & Object & Constructor ๊ธ์ ๋ค์ ๊ธฐ์ตํด๋ณด์.
์ฐ๋ฆฌ๊ฐ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋, ์ฝ๊ฒ ๋งํด, ์ด๋ค ๋ฌผ์ฒด๋ฅผ ์ ์ํด์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ํฉ๋ฆฌ์ ์ด๋ผ๋ ํ๋จ์ด ๋ค์ด์ ์ด๋ค.
ํจ์๋ง ๊ฐ์ง๊ณ ์ ๋ฌด์ธ๊ฐ๋ฅผ ๋ง๋ค๊ธฐ ๋ณด๋ค๋, ๋ด๊ฐ ๋ฌผ๊ฑด์ ์ ์ํ๊ณ ๊ทธ ๋ฌผ๊ฑด๋ค์ ์ค์ ๋ก ๋ง๋ ๋ค, ๋ฌผ๊ฑด๋ค๋ก ๋ค๋ฅธ ํ๋์ ํ๋ ๊ฒ์ด ๋ณด๋ค ์ฝ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด์ ์ ์ฌ์ฉํ๋ ์ฌ์ง์ ๋ค์ ์ฌ์ฉํด๋ณด๋ฉด,
๊ฐ๋จํ๊ฒ ์ด๋ ๊ฒ ์ ์ํ ์ ์๋ค. ๋ฌผ์ฒด๋ฅผ ์ ์ํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ๊ฒ์ดย ํด๋์ค, ๊ทธ ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ง ๋์์ดย ๊ฐ์ฒด, ์ค์ ๋ก ๋ง๋ค์ด์ ธ ๊ตฌ์ฒดํ ๋ ๋ฌผ์ฒด๋ฅผย ์ธ์คํด์ค๋ผ ๋ถ๋ฅธ๋ค.
๊ทธ๋ผ, ์์์ ๊ฐ๋ ์ ์ ํ์ํ ๊น? ์์ ํด๋์ค ์์์์ ๋ฆฌ๋ชจ์ปจ ์ค๊ณ๋๋ ๊ต์ฅํ ๋ค์ํ ์ ์๋ค.
TV ๋ฆฌ๋ชจ์ปจ, ์ฐจ ๋ฆฌ๋ชจ์ปจ, ์์ด์ปจ ๋ฆฌ๋ชจ์ปจ.. ์ด๋ ๊ฒ ๋ค์ํ ๋ฆฌ๋ชจ์ปจ์ด ์์ง๋ง, ์ด๋ ์์ ์ธ์์ ์กด์ฌํ๋ ํ๋์ ๋ฌผ๊ฑด(์ธ์คํด์ค)๋ก ๊ตฌํํ๊ธฐ ์ํด์๋, ๊ฐ์์ ๋ง๋ ์ค๊ณ๋(Class)๊ฐ ๋ฐ๋ก ํ์ํ๋ค.
ํ์ง๋ง ์ด๋ ์๋ค์ด ๊ฐ์ง๋ ๊ทผ๋ณธ์ ์ธ ํน์ฑ์ ๋ชจ๋ ๋์ผํ๋ค. ์ด ์ค๊ณ๋(Class)๋ฅผ ๋ง๋ค ๋ ์์ด์ ๋ณด๋ค ํฐ ์งํฉ ๊ฐ๋ ์ ๋์ ํ๋ฉด ์ด๋จ๊น? ๋ ํฐ ํด๋์ค์์ ๊ฐ์ง๋ ํน์ฑ์ ๋ณํํด์ ๋ค๋ฅธ ํด๋์ค๋ฅผ ๋ง๋ค๋ฉด ์ด๋จ๊น?
์ด๊ฒ์ด ๋ฐ๋กย ์์ย ์ด๋ค.
์ด๋ ๊ฒ ๋ถ๋ชจ ํด๋์ค๋ก ๋ถํฐ ํ์๋ ๋ค๋ฅธ ๋ ์๋ค์ ๋ง๋ค์ด ๊ฐ์ ธ๋ค ์ธ ์ ์๋ค.
๋ฐ๋ผ์ ๋ถ๋ชจํด๋์ค๋ ์์ํด๋์ค์ ๋ด์ฉ์ ๋ฐ๋์ ๊ฐ์ง ์ ๋ฐ์ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ถ๋ชจ ํด๋์ค๊ฐ (A) ์ด๊ณ , ๋ถ๋ชจํด๋์ค๋ก ๋ถํฐ ๋ง๋ค์ด์ง ํ์ ํด๋์ค๊ฐ (Aโ) ๋ผ ํ์ ๋, ๊ฐ๊ฐ์ ํด๋์ค๋ก ๋ถํฐ ๋ง๋ค์ด์ง ๊ฐ์ฒด๊ฐ (a, aโ)์ด๋ผ ํ๋ฉด, ํ ๋น์ด ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ ํ๋๋ฟ์ด๋ค.
a = a'; // ๊ฐ๋ฅ
a' = a; // ๋ถ๊ฐ๋ฅ
์ด๋ ๊ฒ ๋ถ๋ชจ๋ ์์์ ๋ด์ฉ์ ์ผ๋ถ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์, ์๋ ๋ณ์๋, ํจ์์ ๊ดํด์๋ ๋ฌด์ํ๊ณ ์๋ ๊ฐ๋ง ํ ๋น ๋ฐ์ผ๋ฉด ๋์ง๋ง,
์์ ํด๋์ค์ ๋ถ๋ชจํด๋์ค์ ๊ฐ์ ํ ๋น ํ ์ ์๋ค.
์์ ํด๋์ค๊ฐ ๊ฐ์ง๋ ๋ณ์๋ ๋ถ๋ชจํด๋์ค๊ฐ ๊ฐ์ง๊ณ ์์ง ์๊ธฐ ๋๋ฌธ์ ์ด๋ค ๊ฐ์ ํ ๋น ๋ฐ์์ผํ๋์ง ๋ชจํธํด์ง๊ธฐ ๋๋ฌธ์ด๋ค.
Base ์ Derived ๊ฐ ์์๊ด๊ณ
Summary
- Base : Privateย โ ์ฌ์ฉ ๋ถ๊ฐ
- Base : Protectedย โ Private
- Base : Publicย โ ์์ ํ์ ์ ๋ฐ๋ผ ๋ณํ!
Example 1
#include <iostream>
using namespace std;
class Base {
public:
void print_base() { cout << "Base" << endl; }
};
class Derived : private Base{ // Base๋ฅผ Private์ผ๋ก ๋ฐ์ผ๋,
// ์ด ํด๋์ค ๋ด์์๋ ๋ชจ๋ Private์ผ๋ก ๋ฐ๋๋ค.
// ๋ฐ๋ผ์ ์ง๊ธ์ ์ ํ ์์ง ์์ง๋ง, ์ด ํด๋์ค์ private๋ Base ํด๋์ค๊ฐ
// ๊ฐ์ง๋ public๋ด์ ๋ณ์์ ํจ์๋ฅผ ๊ฐ๋๋ค.
public:
void print_derived() {
Base::print_base(); // ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ Base ํด๋์ค์ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
// private์ด๋๊น!
cout << "Derived" << endl; }
};
int main(){
Base base;
Derived derived;
base.print_base();
//derived.print_base(); ์ด ๋ถ๋ถ์ ์๋ฌ๊ฐ ๋ฌ๋ค.
// Derived ํด๋์ค์์๋ print_base ํจ์๊ฐ Private ์ด๋ค.
derived.print_derived();
return 0;
}
Output
Base
Base
Derived
Program ended with exit code: 0
Initialize List์ ์ค์์ฑ
์ง๊ธ๊น์ง ์์์ ํด๋์ค๋ฅผ ์์ํ๋๋ฐ ์์ด ๊ธฐ์กด ํด๋์ค์์ ์ ์๋ ์์ฑ๊ณผ, ํ์ ํด๋์ค์์ ์ด๋ค ๋ฐฉ์์ผ๋ก ์์์ ๋ฐ๋์ง์ ๋ฐ๋ผ ์ฌ์ฉํ ์ ์๋ ๋ฒ์๊ฐ ์ ํ๋จ์ ๋ฐฐ์ ๋ค.
๊ทธ๋ฐ๋ฐ, ๋ณดํต ์ฐ๋ฆฌ๋ ํด๋์ค๋ฅผ ์์ฑํ ๋, Private์ ์ด ํด๋์ค๊ฐ ๊ฐ์ง๋ ๋ณ์๋ค์ ์ ์ํ์ฌ ์ฌ์ฉํ๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ด๊ฐ ํ์ํด๋์ค๋ฅผ ์์ฑ ํ ๋, ์์ ์์ฑ์ Publicย ์ผ๋ก ์ค๋ค๊ณ ํ๋๋ผ๋, Private์ ์์ฑ๋ ๋ ์์ ์ฌ์ฉํ ์๊ฐ ์๋ค.
๋ฐ๋ผ์ ๋ด๊ฐ ๋ง๋ ํ์ ๋ณ์๊ฐ ๊ธฐ์กด์ ํด๋์ค๋ฅผ ๋ฐ์์ ๊ฐ์ ๋ณ์๋ค์ ๋ฃ์ด์ค์ผ ํจ์๋ ๊ทธ ๋ณ์์ ์ ๊ทผํ ์๊ฐ ์๋คย ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
์ด ๋, Initialize List๊ฐ ์ค์ํ ์ด์ ๊ฐ ๋์จ๋ค. ์์ ๋ฅผ ํตํด ์์๋ณด์.
Example
#include <iostream>
#include <string>
using namespace std;
// ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์๋ฅผ Public์ ์ ์ํ๋ค.
class Text{
private:
string text;
public:
Text(string _t) : text(_t) {}
};
// ํ์ ํด๋์ค์์๋ ๋ถ๋ชจ ํด๋์ค๋ฅผ ๋ฐ์, ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ๊ตฌํํ๋๋ก ํ๋ค.
// ์ด ๋ ๋ถ๋ชจํด๋์ค์ Private๋ ํ์ํด๋์ค์์ ์ง์ ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
class FancyText: public Text{
private:
// string text; ์ด ๋ณ์๋ ํ์ํด๋์ค์์ ์ง์ ์ ์ผ๋ก ์ฌ์ฉํ ์๋ ์๋ค.
// ํ์ง๋ง ์์ ๋ฐ์๊ธฐ ๋๋ฌธ์ ์ด ๋ณ์๋ ํ์ ํด๋์ค์์๋ ์ค์ํ ์ญํ ์ ํ ๊ฒ์ด๋ค.
// ๊ทธ๋ ๋ค๋ฉด ํ์ ํด๋์ค๋ฅผ ์ ์ธํ ๋, ์ด ๋ณ์๋ฅผ ์ด๋ป๊ฒ ๋ฐ์ ์ ์์๊น?
string left_brac;
string right_brac;
string connector;
public:
// ์ ๋ต์ ํ์ ํด๋์ค์์ ์์ฑ์๋ฅผ ํธ์ถํ ๋, Initialize list๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋๋ฐ,
// ์ฌ์ฉ์๋ก ๋ถํฐ ์ด๊ธฐ๊ฐ์ ๋ฐ์๋, ๊ทธ ๊ฐ์ initialize list์ ์ธ์๋ก ๋๊ฒจ์ค๋ค.
// ์์ ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์๋ฅผ ๋ณด๊ฒ๋๋ฉด, Public์ผ๋ก ์ ์ธ๋์๊ธฐ ๋๋ฌธ์,
// ํ์ ํด๋์ค์์ ์ด ์์ฑ์๋ฅผ ๊ฐ์ ธ๋ค๊ฐ ์ฌ์ฉํ ์ ์๋ค!!
FancyText(string _t, string _lb, string _rb, string _con):
Text::Text(_t), left_brac(_lb), right_brac(_rb), connector(_con){
}
// Text::Text(_t) ์ด ๋ถ๋ถ์ด ๋ถ๋ชจํด๋์ค์ ์์ฑ์๋ฅผ ํธ์ถํ ๋ถ๋ถ์ด๋ค.
// ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ private๋ก ์ ์ธ๋์ด ์๋ ๋ถ๋ชจํด๋์ค์ ์์ฑ ๋ถ๋ถ์
// ๊ฐ์ ์ ์ผ๋ก ์์ฑ์๋ฅผ ํธ์ถํจ์ผ๋ก์จ ์ด๊ธฐํ์ ์ฑ๊ณตํ๋ค.
};
class FixedText : public Text{
public:
FixedText() : Text::Text("FIXED"){}
// ์์ฑ์๋ฅผ ํธ์ถํ ์ ์๊ฒ ํด์ค๋ค๋ ๊ฒ์ด initialize list์ ์์ฒญ๋ ์ฅ์ !!!!
};
function overloading
์ด๋ฆ๋ง ๊ฐ์ ํจ์๋ฅผ ์๋ฏธํ๋ค. ์ ๋ ฅ ํ๋ผ๋ฏธํฐ์ ์๋ฃํ, ์ ๋ ฅ ํ๋ผ๋ฏธํฐ์ ๊ฐฏ์, ์ถ๋ ฅํ๋ผ๋ฏธํฐ์ ์๋ฃํ ๋ฑ, ์๋ฌด ์๊ด์ด ์๋ค.
ํ์ง๋ง ํจ์ ์ด๋ฆ์ ๋์ผํ๊ฒ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์๋ง๋ ๋ณธ์ง์ ์ผ๋ก ์ํํ๋ ๋ด์ฉ์ ๋์ผ ํ ๊ฒ์ด๋ค.
๋ฐ๋ผ์, ํจ์ ์ค๋ฒ๋ก๋ฉ์,ย ํ๋ ํ๋, ๋ณธ์ง(A)์ด ๋์ผํ ๋ ์ย ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
๊ฒฐ๊ตญ ๊ฐ์ ์ด๋ฆ์ ๋ค๋ฅธ ํจ์๋ค์ดย ์์ด๊ณ ์๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ function overloadingย ์ด๋ผ ํ๋ค.
int sum(int x, int y),
double sum(double x, double y)
float sum(float x, float y, float z)
function overriding
ํจ์ ์ค๋ฒ๋ผ์ด๋ฉ์ ์์์ ํน์ํ ๊ฒฝ์ฐ์ ํด๋น๋๋๋ฐ, base ํด๋์ค์ ํจ์๋ก ๋ถํฐ ์์๋ฐ์ ๊ตฌ์ฒด์ ์ด๊ฑฐ๋, ํน์ ์ด ํด๋์ค์ ๋ง๋ ๋ฐฉ์์ผ๋ก ํจ์๋ฅผ ์ฌ์ ์ ํ ๋ ์ฌ์ฉํ๋ค.
์ฆ,ย ๊ฐ์ ์ด๋ฆ, ๋ ๊ฐ์ ์ ๋ ฅํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์ผ๋, ํจ์๋ด์ ์๋์ ์์ด์ ํจ์ ์ค๋ฒ๋ก๋ฉ ์ฒ๋ผ (A)์ ๋ณธ์ง์ ๋ฐ๋ฅด๊ธฐ ๋ณด๋ค๋,
Aโ ํน์ Bย ์ ๊ฐ์ด ๋ณ๊ฒฝ์ด ์์ ์ ์๋ค. ์์์ ๋ฐ์ ์ด๋ ์์ ๋ด์ฉ์ ๋ณ๊ฒฝํ๊ณ ์์ผ๋ฏ๋ก, ์๋ ํด๋์ค์ ํจ์์ ๋ด๊ฐ ์ํ๋ ๋ด์ฉ์ย ์ถ๊ฐ ํน์ ์ฌ๋ผํย ๊ณ ์๋ค.
๋ฐ๋ผ์ย function overridingย ์ด๋ค.
Virtual, override
์ฐ๋ฆฌ๋ ํจ์ ์ค๋ฒ๋ก๋ฉ์ ํ ๋, ๋ถ๋ชจ ํด๋์ค๋ก ๋ถํฐ ์์ ํด๋์ค๋ก ๊ฐ๋, ๋ณ๊ฒฝ๋ ์ ์๋ค๋ ๊ฒ์ ๋ช ์ํด์ฃผ๊ธฐ ์ํดย Virtualย ์ด๋ผ๋ ๋จ์ด๋ฅผ ๋ช ์ํด์ฃผ์๋ค.
๋ ์์ํด๋์ค์์๋ ๋ถ๋ชจํด๋์ค๋ก ๋ถํฐ ๋ฐ์๋ค๋ ๊ฒ์ ์๋ ค์ฃผ๊ธฐ ์ํด overrideย ๋ผ๋ ๋จ์ด๋ฅผ ์ฌ์ฉํ๋ค.
์ฌ์ค ํ๋ก๊ทธ๋จ์ ๊ตฌ๋ํ๋๋ฐ๋ ๋ฌธ์ ๊ฐ ์๋ค. ํ์ง๋ง,
- ์ ์ง๋ณด์
- Polymorphism (๋คํ์ฑ)
์ ์ํด ํ์์ ์ด๋ ๋ช ์์ ์ผ๋ก ์์ฑํด์ฃผ๋ ๊ฒ์ ์ต๊ด๋ค์ด์.
์์ค์ฝ๋ ์ด ์ ๋ฆฌ
#include <iostream>
#include <string>
using namespace std;
class Text{
private:
string text;
public:
Text(string _t) : text(_t) {}
// ์ด ํจ์๋ ๊ฐ์์ด๋ฉฐ, ํ์ํด๋์ค์์ ๊ตฌ์ฒดํ ๋ ๊ฒ์ ๋ช
์ํ๋ค.
virtual string get(){ return text;}
virtual void append(string _extra) {text += _extra; }
};
class FancyText: public Text{
private:
string left_brac;
string right_brac;
string connector;
public:
FancyText(string _t, string _lb, string _rb, string _con):
Text::Text(_t), left_brac(_lb), right_brac(_rb), connector(_con){
}
// ๋ถ๋ชจ ํด๋์ค๋ก ๋ถํฐ override ๋ ํจ์์์ ๋ช
์ํด์ค๋ค.
string get() override { return left_brac + Text::get() + right_brac; }
void append(string _extra) override{
Text::append(connector + _extra);
// ์ด ํจ์๋ด์ฉ์ ์์ฑํ๋๋ฐ ์์ด, text = text + connector + _extra;
// ์ด๋ ๊ฒ ์ธ ์ ์๋ค. ๋ถ๋ชจํด๋์ค์ text๋ private๋ก ์ ์ธ๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
// ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ๋ถ๋ชจํด๋์ค์ ์ ์๋ public ํน์ฑ์ ํจ์๋ก ์ ๊ทผํด์ ์์ฑํด์ผ ํ๋ค.
}
};
class FixedText : public Text{
public:
FixedText() : Text::Text("FIXED"){}
void append(string _extra) override{
// no operation
}
};
int main(){
Text t1("Plain");
t1.append("A");
cout << t1.get() << endl;
FancyText t2("Fancy", "<<", ">>", "***");
t2.append("A");
cout << t2.get() << endl;
FixedText t3;
t3.append("A");
cout << t3.get() << endl;
// t1 = t2; // ์์ ํด๋์ค ๋ด์ฉ์ ๋ถ๋ชจ์ ๋ฃ์ ์ ์์
// t2 = t1; // ๋ฐ๋๋ ์๋
// return 0;
//}
Output
PlainA
<<Fancy***A>>
FIXED
Program ended with exit code: 0