공부/기타

상속할 때 public 상속과 protected 상속의 차이

셩잇님 2022. 12. 26. 18:25
반응형

 

 

객체 지향 프로그래밍에서 상속을 통해 클래스는 부모(상위) 클래스와 자식(하위) 클래스로 정의될 수 있습니다. 자식(하위) 클래스는 부모(상위) 클래스에서 속성과 동작을 상속하며 필요에 따라 이러한 속성과 동작을 재정의하거나 확장할 수 있습니다.

하위(자식) 클래스를 정의할 때 사용할 수 있는 두 가지 접근 제어 지시자가 있습니다(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 클래스 외부의 코드는 이러한 멤버에 직접 액세스할 수 없습니다.

 

 

 

반응형