객체지향 프로그래밍(OOP)에서는 부모 클래스의 특성을 자식 클래스가 물려받을 수 있습니다. 이때 부모 클래스를 기반 클래스(Base Class)라고 부르고, 자식 클래스를 파생 클래스(Derived Class)라고 합니다. 파생 클래스는 기반 클래스의 데이터 멤버와 멤버 함수를 상속받아 그대로 사용할 수 있습니다.
접근 지정자에 따른 접근 범위
상속받은 멤버에 접근할 수 있는지 여부는 기반 클래스에서 선언된 접근 지정자에 따라 달라집니다.
- public: 파생 클래스, 같은 클래스 내부, 클래스 외부 어디서든 접근할 수 있습니다.
- protected: 파생 클래스와 같은 클래스 내부에서만 접근할 수 있으며, 클래스 외부에서는 접근이 불가능합니다.
- private: 오직 같은 클래스 내부에서만 접근할 수 있고, 파생 클래스조차 접근할 수 없습니다.
즉, 파생 클래스가 상속받더라도 private 멤버에는 직접 접근할 수 없다는 점을 기억해야 합니다.
C++ 상속 예제 코드
다음은 C++에서 상속이 어떻게 동작하는지 보여주는 예제입니다.
#include <bits/stdc++.h>
using namespace std;
class Base {
public: int a; // 파생 클래스 및 외부에서 접근 가능
protected: int b; // 파생 클래스에서만 접근 가능
private: int c; // Base 클래스 내부에서만 접근 가능
};
class Derived : public Base {
public: int x;
};
int main() {
Derived d;
d.a = 10; // public 멤버 접근 가능
d.x = 20; // 자신의 멤버 접근 가능
cout << "Derived class data member value : " << d.x << endl;
cout << "Base class data member value : " << d.a << endl;
return 0;
}실행 결과
Derived class data member value : 20 Base class data member value : 10
코드 설명
위 프로그램에서 파생 클래스 Derived는 기반 클래스 Base와 그 데이터 멤버들을 상속받습니다. 파생 클래스의 객체 d를 생성한 뒤, 이를 통해 기반 클래스의 멤버 a와 파생 클래스의 멤버 x에 각각 접근하여 값을 대입하고 출력합니다.
하지만 변수 b는 protected로 선언되어 클래스 외부에서 접근할 수 없고, 변수 c는 private으로 선언되어 파생 클래스에서도 접근할 수 없습니다. 만약 다음과 같이 접근을 시도하면 컴파일 에러가 발생합니다.
d.b = 30; // 오류: protected 멤버는 외부에서 접근 불가 d.c = 40; // 오류: private 멤버는 파생 클래스에서도 접근 불가
정리
C++의 상속에서 파생 클래스는 기반 클래스의 public과 protected 멤버를 상속받지만, private 멤버는 상속받더라도 직접 접근할 수 없습니다. 따라서 private 멤버에 접근하려면 기반 클래스가 제공하는 public 또는 protected 멤버 함수(getter/setter 등)를 활용해야 합니다. 이러한 접근 제어 메커니즘은 캡슐화를 유지하면서 코드 재사용성을 높이는 객체지향 프로그래밍의 핵심 개념입니다.