자료실/C++

C++ - 클래스(class) 상속

자료수집중 2020. 8. 21.
반응형

 

 

클래스는 '상속'이라는 굉장히 중요한 특징을 가지고 있습니다.

상속이 중요한 이유는 작성한 클래스를 다시 활용함으로 굉장히 많은 코드를 줄여줄 수 있습니다.

예를 들어 학생이라는 클래스와 회사원이라는 클래스를 작성했습니다.

학생과 회사원은 사람이라는 공통점이 있습니다.

그러면 사람의 정보를 상속받고 각각 학생의 추가 정보와 회사원의 추가 정보다 더해준다면 쉽게 클래스를 작성할 수 있게 됩니다.

여기서 사람에 해당하는 클래스를 부모 클래스(parent class) 또는 베이스 클래스(base class)라고 하며

사람을 상속받은 학생과 회사원같은 클래스를 자식 클래스(child class), 파생클래스(derived class)라고 합니다.

 

 

이제 예제를 통해서 클래스를 상속해보겠습니다.

부모 클래스의 정의하는 방법은 일반적인 클래스와 같으니 넘어가겠습니다.

 

자식 클래스는 상속을 받는 방법은 다음과 같습니다.

class 자식클래스이름 : 접근지정자 부모클래스이름
{
	.
    .
};

상속받는 클래스도 접근 지정자를 정할 수 있습니다.

접근 지정자에 따라서 자식클래스의 객체에서 호출 가능 여부가 결정됩니다.

예제로 살펴보겠습니다.

#include <iostream> 
#include <string>

using namespace std; 

class Person {

public:
	Person(string name, int age) {
		this->name = name;
		this->age = age;
	}
	string name;
	int age;
protected:

};
class Student:public Person{
public:
	Student(string name,int age, string id): Person(name, age) {
		this->id = id;
	}
	void show() {
		cout << "이름: " << this->name << '\n';
		cout << "나이: " << this->age << '\n';
		cout << "학번: " << this->id << '\n';
	}
private:
	string id;
};

int main() 
{ 
	Student std("홍길동",16,"ID12345678");
	std.name = "김철수";
	std.show();

	return 0; 
}

Person클래스를 public으로 Student클래스에 상속했습니다.

상속한 다음 중요한 점은 만약에 부모클래스의 생성자에 매개변수가 있다면 자식 클래스를 생성자로 초기화해줄 때 부모 클래스를 같이 초기화할 수 있습니다.

Student(string name,int age, string id): Person(name, age) {
		this->id = id;
}

멤버 이니셜라이저를 이용해서 부모 클래스를 초기화가 가능합니다.(뒷부분에 추가 내용)

부모 클래스의 생성자 함수에 매개 변수가 있다면, 자식 클래스에서 받은 매개변수를 이용해서 초기화가 가능합니다.

 

다음으로 public으로 Person클래스를 상속받았기 때문에

main함수에서 Student의 객체로 Person클래스의 멤버에 접근이 가능합니다.

만약 public으로 상속을 했지만 자식 클래스만 사용하고 싶게 하고 싶다면

접근 지정자에서 배운 protected를 사용하면 됩니다.

protected로 선언된 멤버 변수 또는 함수는 자식 클래스(또는 파생 클래스)만 사용이 가능합니다.

*friend도 사용 가능은 합니다.

Person클래스의 내부 멤버를 protected로 수정하면

class Person {

public:
	Person(string name, int age) {
		this->name = name;
		this->age = age;
	}

protected:
	string name;
	int age;

};

이제 public으로 상속하더라도 protected로 선언된 멤버들은 상속된 클래스만 멤버를 호출, 수정이 가능합니다.

 

 

멤버 이니셜라이저(Member Initializer)는 멤버 변수 초기화를 하기 위해서 많이 사용하는 방법 중 하나입니다.

보통 다음과 같이 생성자를 정의합니다.

class Student{
public:
	
	Student(string name,int age, string id):Person(name, age) {
		this->name = name;
        this->age = age;
        this->id = id;
	}

private:
	string name;
	int age;
	string id;
	
};

하지만 멤버 이니셜라이저를 이용해서 초기화하면 다음과 같이 수정이 가능합니다.

class Student{
public:
	
	Student(string name, int age, string id) : name(name), age(age), id(id) {}
private:
	string name;
	int age;
	string id;
};

또는 const 변수를 초기화할 때 가능합니다.

const가 붙는 변수는 상수입니다. 그래서 선언과 동시에 초기화를 해야 합니다.

하지만 멤버 이니셜라이저를 이용하면 초기화가 가능합니다.

class Student{

public:
	
	Student(string name, int age, string id) :name(name), age(age), id(id) {}
	void show() {
		cout << "이름: " << this->name << '\n';
		cout << "나이: " << this->age << '\n';
		cout << "학번: " << this->id << '\n';
	}
private:
	const int age;  //멤버 이니셜라이저 초기화 가능
	string name;
	string id;
};

멤버 이니셜라이저는 생성자의 정의된 코드가 실행되기 전에 먼저 실행되는 명령입니다.

그래서 상수 멤버도 초기화가 가능합니다.

 

댓글