학생과 선생의 공통점 = " 사람" 이라는 것

→ 그래서 공통된 사람의 "속성"을 상속받도록 하는 것

상속을 받은 base클래스의 멤버변수는 base의 메서드를 통해 관리를 해줘야한다.

→ 생성자생성에서 derived 클래스에서 base의 멤버변수는 base의 생성자를 호출해야 하는것

private 는 클래스 외부에서 접근을 못한다.

→ 상속에서도 적용이다. 자식클래스 또한 접근이 불가능하다. 하지만 protected는 자식에서는 가능하다. 혹은 base클래스의 멤버변수를 public으로 해서 상속과 클래스 외부에서 사용이 가능하도록 할 수도 있다.

하지만 캡슐화를 권장하기에 private를 사용하는 것을 추천한다.

예제 실습


Base

  1. 언뜻 보면 Base는 string을 다루는 클래스라고 생각하면 된다. 그 외의 string을 받아 새로운 이름으로 덮어씌우는 setName 메서드와 현재 이름을 반환하는 getName 메서드를 통해 데이터를 관리하는 클래스이다.

그렇기에 기본적으로 다른 클래스에 상속하기 적합한 형태로 구성되어 있어 Derived의 학생과 선생의 클래스의 속성 중 하나인 이름에 상속을 부여해서 코드를 효율적으로 다룰 수 있게 된다.

#pragma once
#include <string>
#include <iostream>

class Person {
private:
    std::string m_name;

public:
    Person(const std::string& name_in = "No Name")
        :m_name(name_in){}

    void setName(const std::string& name_in) {
        m_name = name_in;
    }

    std::string getName() const { return m_name; }

    void doNothing() const {
        std::cout << m_name << " is doing nothing" << std::endl;
    }
};

Derived

  1. Derived 클래스에서의 "학생" 과 "선생" 은 공통적인 성질 [이름] 을 가지고 있다. 그래서
    이름을 다루는 메서드 [이름 새로 바꾸기] , [이름 반환받기] 또한 [사람] 클래스에서 몰아 넣어서 관리를 하기 쉽도록 할 수 클래스 내부에 메서드를 설정하게 되면 클래스를 수정하기도 그리고 다루기도 쉬워진다.
  2. Derived 클래스에서는 학생은 공부를 선생은 가르침을 하기 때문에 base가 되는 Person과는 다른 Derived 클래스 만의 행동을 추상화하여 생성할 수 있다.
    학생은 멤버변수인 "지능" 과 그리고 "공부 메서드" 를 가지고
    선생은 멤버변수는 없고 "가르침 메서드"를 가지고 있다.

결론적으로는 Base는 상속받는 것들 중에서 공통된 것을 부여받고 공통된 것을 다루는 메서드를 다루게 된다. Derived는 Dervied만의 속성을 다루기만 하면된다. 그로 인해 계속 상속을 해도 각자 담당하는 부분을 담당하는 속성을 나타내는 클래스만으로 접근하기에 수정 또한 담당 클래스를 조금 수정하면 유지 보수가 편하다.

Student Class

#pragma once

#include <string>
#include "Person.h"

class Student : public Person {
private:
    int m_intel;

public:
    Student(const std::string& name_in = "No Name",const int & intel_in = 0)
        : Person{ name_in }, m_intel(intel_in){}

    void setIntel(const int& intel_in) {
        m_intel = intel_in;
    }

    int getIntel() { return m_intel; }
    void studing() {
        std::cout << getName() << "is studing" << std::endl;
    }
    friend std::ostream & operator << (std::ostream& out, const Student& student) {
        out << student.getName() << " " << student.m_intel;
        return out;
    }

};

Teacher Class

#pragma once
#include "Person.h"

class Teacher :public Person{
private:
public:
    Teacher(const std::string& name_in = "No Name")
        : Person(name_in) {

    }

    void teaching() {
        std::cout << getName() << "is teaching" << std::endl;
    }

    friend std::ostream & operator << (std::ostream& out, const Teacher& teacher) {
        out << teacher.getName();
        return out;
    }
};

'프로그래밍 언어 > C++' 카테고리의 다른 글

[따라 배우는 C++] 11.1 상속의 기본(1)  (0) 2020.10.22

+ Recent posts