객체 지향 프로그래밍에서 상속을 통해 클래스는 부모(상위) 클래스와 자식(하위) 클래스로 정의될 수 있습니다. 자식(하위) 클래스는 부모(상위) 클래스에서 속성과 동작을 상속하며 필요에 따라 이러한 속성과 동작을 재정의하거나 확장할 수 있습니다.
하위(자식) 클래스를 정의할 때 사용할 수 있는 두 가지 접근 제어 지시자가 있습니다(public 및 protected) 이러한 접근 제어 지시자는 부모(상위) 클래스의 상속된 멤버의 가시성과 액세스 가능성을 제어합니다. 다음은 공개(public) 상속과 보호(protected) 상속의 차이점입니다.
공개(public) 상속: 하위(자식) 클래스가 상위(부모) 클래스에서 공개적으로 상속되면 상위(부모) 클래스의 public 및 protected 멤버가 하위 클래스의 public 멤버가 됩니다. 즉, 하위(자식) 클래스에서 상위(부모) 클래스의 객체에 자유롭게 액세스하고 수정할 수 있으며 하위(자식) 클래스의 인스턴스에 액세스할 수 있는 모든 코드도 가능합니다. 공개 상속은 하위 클래스가 상위 클래스의 보다 특수화된 버전인 "is-a" 관계를 모델링하는 데 자주 사용됩니다.
보호된(protected) 상속: 하위(자식) 클래스가 상위(부모) 클래스에서 보호적으로 상속되면 상위(부모) 클래스의 public 및 protected 멤버가 하위(자식) 클래스의 보호된 멤버가 됩니다. 즉, 하위(자식) 클래스는 이러한 멤버에 액세스하고 수정할 수 있지만 하위(자식) 클래스 외부의 코드는 직접 액세스할 수 없습니다. 보호된 상속은 하위(자식) 클래스가 자체 동작을 구현하기 위해 상위 클래스의 구성원을 사용하는 "has-a" 또는 "is-implemented-in-terms-of" 관계를 모델링하는 데 자주 사용됩니다.
다음 예제는 공개(public) 상속과 보호(protected) 상속의 차이점을 설명하는 C++의 예입니다.
class Shape {
public:
int sides;
void setSides(int s) { sides = s; }
};
class Triangle : public Shape {
public:
double area() { return 0.5 * sides * sides; }
};
class Square : protected Shape {
public:
double area() { return sides * sides; }
};
int main() {
Triangle t;
t.setSides(3); // okay
t.sides = 4; // okay
Square s;
s.setSides(4); // error: setSides is protected
s.sides = 4; // error: sides is protected
return 0;
}
위 예에서 Triangle 클래스는 Shape 클래스에서 공개적으로 상속하므로 Sides 멤버와 setSides 멤버 함수는 모두 Triangle의 public 멤버입니다. 즉, 기본 또는 Triangle 인스턴스에 액세스할 수 있는 다른 코드에서 자유롭게 액세스하고 수정할 수 있습니다.
반면에 Square 클래스는 Shape 클래스에서 보호적으로 상속되므로 Sides 멤버와 setSides 멤버 함수는 모두 Square의 보호된 멤버입니다. 즉, Square 클래스 내에서 또는 Square의 하위 클래스에서만 액세스하고 수정할 수 있습니다. main과 같은 Square 클래스 외부의 코드는 이러한 멤버에 직접 액세스할 수 없습니다.
'공부 > 기타' 카테고리의 다른 글
정렬 알고리즘 중 가장 빠른 알고리즘은 무엇일까? (0) | 2022.12.29 |
---|---|
온라인 게임에서 유저들을 관리하기 위해 효율적인 정렬 알고리즘과 그 이유는? (0) | 2022.12.26 |
업 캐스팅과 다운 캐스팅의 개념 및 차이 (0) | 2022.12.22 |
나누기 연산자는 왜 다른 연산자에 비해 느릴까? (0) | 2022.12.22 |
float이 빠를까?, double이 빠를까? (0) | 2022.12.22 |