상속에 대한 이야기를 간단하게 해 보려고 합니다.
잘못 서술한 부분이나 궁금한 점이 있다면 댓글로 알려주세요.
상속이라는 개념이 설명할 분량이 거대해서 여러번에 걸쳐서 순차적으로 설명하겠습니다.
급여 관리라는 프로그램의 예시를 통해서 상속이라는 것에 대해서 서술할 예정입니다.
[C++]상속(Inheritance)
C와 같은 절차지향언어와 C++, Java와 같은 객체지향언어 사이에는 많은 차이점이 있겠지만, 그 중에서 객체지향언어만의 두드러지는 특성은 상속이라고 생각합니다. 상속은 객체들 간의 관계의 구축 방식이라고 할 수 있습니다. 이 것만 보고는 무슨 의미인지 잘 와닿지 않을 테니 좀 더 자세히 설명해 보겠습니다.
프로그래밍에서의 상속이라는 의미는 일상에서 사람들이 사용하는 상속의 의미와 유사합니다.
얼마 전에 삼성 회장이 어마어마한 금액의 재산을 상속받았다는 기사를 본 적이 있을 것입니다. 여기서 사용된 상속이라는 의미와 유사하게 클래스 간의 상속은 기존에 없던 특성을 부모 클래스로 부터 물려받는 것입니다.
그냥 C언어처럼 절차지향 프로그래밍을 하면 되지 배우기도 힘들고 짜증나게 복잡한 객체의 상속이라는 기능을 사용 하는지에 대한 의문이 들텐데(아니면, 말구요..ㅎ) 객체지향의 상속만의 많은 장점들이 존재합니다.
과거에는 상속이라는게 기존의 작성한 코드를 재활용한다는 의미가 컸습니다.
하지만, 오늘날에는 상속을 바라보는 관점에 변화가 생겼습니다.
오늘날의 프로그램들은 과거에 비해서 점점 더 규모가 커지고 복잡해지고 있습니다. 그렇기 때문에
아래의 요소들의 중요성이 점점 커지고 있습니다.
- 확장성
- 유연성
유연성과 확장성
어떤 메신서 어플을 만들었다고 가정해봅시다.
이 어플을 사용하다가 메뉴 부분이 마음에 안들어서 고치고 싶고, 기존에 없었던 이모티콘 기능을 추가하고 싶어졌다고 했을 때, 메뉴를 고치고 이모티콘 기능을 추가하기 위해서 기존에 작성했던 코드의 상당 부분을 갈어엎어야 한다면, 엄청난 시간과 노력이 필요합니다. 기존의 코드의 변경을 최소화해서 기능의 변경과 추가가 가능하다면 사업을 한다고 했을 때 많은 돈과 시간을 아낄 수 있을 것입니다. 이걸 가능하게 해 주는 것이 상속 이라는 기능입니다.
너무 이론적인 이야기를 오래 했네요. 이쯤하고 코드와 문법적인 부분을 살펴보겠습니다.
코드를 예시로 들어서 설명하겠습니다.
예제 코드
이유는 모르겠으나, 전통적으로 학교나 책에서 객체지향의 상속을 가르칠 때, 회사의 급여관리 시스템을 예를 들어서 주로 설명합니다. 음... 지금 생각해보니, 상속의 예시로 들기에 안성맞춤이네요. 상속 예시의 베스트 셀러 인정합니다.
일단은 2개의 클래스를 정의해 보겠습니다.
PermanentEmployee : 정규직 형태의 객체 클래스
Handler : PermanentEmployee를 컨트롤 하기위한 클래스
여기서 주목해야 할 것은 Handler 클래스 입니다.
위의 클래스는 역할이 서로 다릅니다. PermanentEmployee 클래스는 데이터 성격의 클래스입니다. 급여관리 시스템의 테이터의 저장을 위한 성격이 강합니다. 반면에, Handler 클래스는 기능적인 성격을 가지고 있는 클래스입니다.
Handler 클래스는 프로그램에서 실제 기능의 처리 역할을 하는 클래스입니다. 기능제공의 핵심적인 역할을 합니다. 객체지향 프로그램에서 반드시 존재하는 클래스입니다.
Handler 클래스는 보통 "컨트롤 클래스" 또는 "핸들러 클래스"라고 부릅니다. 지금 보니 클래스 네이밍을 좀 잘 못 했네요. 클래스의 이름과 명칭이 핸들러로 겹치다니... 그래도 무난하게 이해할 수 있을 거라 생각합니다.
<전처리기 부분>
#include<iostream>
#include<cstring>
using namespace std;
#define NAME_LEN 50
#define Person_Num 50
<PermanentEmployee class>
class PermanentEmployee // Class for Object data
{
private:
char name[NAME_LEN]; //이름
int salary; //급여
public:
PermanentEmployee(const char* name, int money) : salary(money)
{
strcpy(this->name, name);
}
int GetPay() const //급여를 반환
{
return salary;
}
void ShowInfo() const //이름과 급여정보를 위한 함수
{
cout << "name : " << name << endl;
cout << "salary : " << salary << endl;
}
};
노동자의 이름을 저장하기 위한 변수와 급여를 저장하기 위한 변수를 선언했습니다.
<Handler class>
class Handler // Class for objects Handling
{
private:
PermanentEmployee* List[Person_Num];
int EmployeeCount;
public:
Handler() : EmployeeCount(0) {}
void AddEmployee(PermanentEmployee* Employee)
{
List[EmployeeCount] = Employee;
++EmployeeCount;
}
void ShowAllInfo() const
{
for (int i = 0; i < EmployeeCount; i++)
List[i]->ShowInfo();
}
~Handler()
{
for (int i = 0; i < EmployeeCount; i++)
delete List[i];
}
};
PermanetEmployee 객체를 배열의 형태로 관리하기 위해서 List라는 배열을 선언했습니다.
그리고 현재 List 배열에 저장되어 있는 Employee 객체의 수를 기록하기 위해서 EmployeeCount 변수를 선언했습니다. 그 외의 선언한 함수는 쉽게 이해할 수 있을 거라고 생각해서 설명을 생략하겠습니다.
그러면, 위의 정의한 클래스가 어떻게 동작하는지 사용해 보겠습니다.
<Main>
int main()
{
Handler handler;
handler.AddEmployee(new PermanentEmployee("Elsa", 5000));
handler.AddEmployee(new PermanentEmployee("Olaf", 1000));
handler.AddEmployee(new PermanentEmployee("hans", 500));
handler.ShowAllInfo(); //handler에 있는 모든 정보 출력
return 0;
}
<실행결과>
상속이 필요한 순간
지금까지 급여를 관리하는 간단한 프로그램 코드를 작성해봤습니다.
이 상태에서 프로그램의 변경이 없으면, 편하고 좋겠지만 고용의 형태는 다양합니다.
위의 작성한 프로그램에서 영업직이나 아르바이트생까지 관리가 가능한 프로그램을 만든다고 한다면, 상속없이는 위의 작성한 코드의 많은 부분을 갈아엎어야 합니다.
기존의 코드의 많은 변경을 통해서 기능을 추가가 이뤄진다고 했을 때, 기존의 프로그램에서 새로운 기능을 추가하거나 변경을 하는 것에 너무 많은 비용이 발생합니다. 또한 기능의 추가 변경을 한 번만 할 거라는 보장이 없습니다. 그러므로 기능을 추가하거나 변경할 때마다 이전에 작성한 코드에서 상당부분을 바꾸거나 추가하는 일이 빈번하게 일어 납니다. 생각만 해도 지치는 일이 아닐 수 없습니다.
그렇지만, 상속이라는 개념을 이요한다면 코드의 변경을 최소화 할 수 있습니다. 위에서 말한 것 처럼 유연성과 확장성을 살릴 수 있습니다.
지금까지는 상속의 문법적인 부분이나 사용방법 보다는 왜 상속이 필요한지와 같은 이론적인 측면에 대해서 설명을 했습니다. 그냥 상속에 대한 문법을 익히는 것 보다 상속이 없었을 때의 불편함을 느껴보고, 상속이라는 개념이 어떻게 사용되는지에 대해서 알게 된다면 상속에 대한 깊은 이해를 할 수 있을 것입니다.
다음 글에서는 위의 코드에서 상속을 통해서 어떻게 영업직이나 아르바이트생을 코드의 변경을 최소화하고 추가를 하는지에 대해서 알아보겠습니다.
'컴퓨터 > C\C++' 카테고리의 다른 글
[C/C++]C++ 이차원 배열 동적할당 (0) | 2021.07.11 |
---|---|
[C++ STL]pair 클래스 사용방법 (0) | 2021.06.05 |
[c언어/c++] isdigit 함수(숫자를 판별하는 함수) (0) | 2021.05.15 |
C/C++ : static 선언에 대하여 (0) | 2021.03.02 |