상속 (inheritance)
객체지향의 꽃이라고도 불리는 상속은 상위 클레스의 함수, 변수 등을 반복해서 작성하지 않고 재사용을 위해서 만들어 졋다.
friend를 써도 될거 같은데, friend는 private변수까지 모두 다 사용이 가능해지는데, 이는 접근제어가 깨지게 된다.
이를 보안하기 위해 나온게 상속은 아니지만, 현재로써 내가 이해한 가장 큰 필요성인 것 같다.
문법 Syntax
class Test { private: int num; public: Test(num){ this->num = num; } void test() { // code } }; class Test2 : public Test { private: int num; public: Test2(num) :Test(num) { this->num = num; } void test2() { // code } };
Test2 클래스는 Test 클래스를 public으로 상속 받고 있다.
이를 public 상속이라 하며 Test2 형으로 선언된 class 변수는 .test()와 test2() 모두 사용이 가능하다.
하지만 private로 선언된 변수라든가, 함수는 직접 적으로 접근하지 못한다.
그래서 상속받은 자식 클레스에 한에 접근이 가능하도록 하는 권한이 protected가 있다.
또한 16-17번 줄을 보면,
부모(상위) 클래스의 생성자가 존재한다면, 자식(하위) 클래스에서 초기화 해주어야 한다.
Private, Protected, Public 상속
상속을 할 때 class class_name : public other_class
와 같은 방식으로 상속을 해주었는데,
이때 public, protected, private 선언에 따라 상속 받을 수 있는 권한이 달라지게 된다.
class Test { private: void func_private() {...} protected: void func_protected() {...} public: void func_public() {...} };
위와 같은 Test 클래스가 있다고 했을때 Test를 어떤 권한을 가지고 상속 받느냐에 따라 접근 권한이 달라진다.
가장먼저,
class pubTest : public Test {}
란 클레스가 있을때, pubTest 클래스는 Test 클래스의 func_public() 밖에 쓰지 못한다.
즉 public 권한을 가진 변수/함수 등 밖에 접근하지 못한다.
class proTest : protected Test {}
란 클래스는 public 변수/함수와 protected 변수/함수 등 가지 접근이 가능하다.
또한 상속 되면서 Test (부모)클래스의 public 변수/함수 등도 protected로 변하면서 외부에서 접근이 불가능하다!
마지막으로 class priTest : private Test {}
는 private에 있는 변수/함수엔 접근하지 못한다.
다만 무모 클래스의 Protected 와 Public 변수/함수는 private로 변하게 되면서 이를 다시 상속 받은 변수에서도 사용할 수 없게 된다!