• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

상속과 접근제한자

21.01.24 15:23 작성 조회수 147

0

안녕하세요! 강의 너무 잘듣고 있습니다.

다름이 아니라 상속과 접근제한자에 관하여  궁금한 점이 생겨 아무리 찾아봐도 해결되지않아 질문을 남기게되었습니다.

파생 클래스는 기본 형식보다 높은 액세스 수준을 가질 수 없습니다. internal 클래스 A에서 파생된 public 클래스 B를 선언할 수 없습니다. 이것이 허용된다면 파생 클래스에서 A의 모든 protected 또는 internal 멤버에 액세스할 수 있게 되므로 결과적으로 A가 public이 되는 것과 같아집니다.

출처 : https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers

위의 경우 

파생 클래스에서 A의 모든 protected 또는 internal 멤버에 액세스할 수 있게 되므로 결과적으로 A가 public이 되는 것과 같아집니다.

라는 이유로

파생클래스에서 더 높은 엑세스 수준을 가질 수 없다고 하는데 해당 부분이 이해가 잘 가지 않습니다.

혹시 예시를 들어 안되는 이유를 알려주실 수 있나요?

(public 접근 제한자를 갖는 메서드안에서 private 멤버를 사용할 수 있는 것처럼 public 클래스가 internal 클래스를 상속할 수 있다고 생각이 되어 헛갈립니다.)

(public 메서드 안에 private변수에 접근할 수 있다고해서 private변수가 결과적으로 public인것은 아니지 않습니까?)

답변 1

답변을 작성해보세요.

1

저기서 설명하는 접근 제한자는 멤버 변수나 멤버 함수에 대한 얘기가 아니라
class 자체의 접근 제한자에 대한 얘기이기 때문에 그렇습니다.

멤버 함수나 멤버 변수는 private/protected로 설정 시
[외부에서는 접근 불가능하다는 의미]인데,
설령 다른 public 함수를 통해서 간접적으로 사용했다고 하더라도
결과적으로 [private 함수 = 외부 접근 불가] 명제가 어긋난 것은 아니기 때문이죠.
(private 함수는 외부 노출하기 싫으니, 내부에서 알아서 잘 체크해서 필요할 때 안전하게 잘 사용한 느낌)

반면 class의 상속 관계에서
public class Dog가 private class Animal을 상속 받는다고 가정하면
Dog은 Dog이기도 하지만, Animal이기도 합니다.
즉 멤버 함수나 멤버 변수와는 다르게
양쪽에 모두 해당하는 상태인데,
두 접근 제한자가 일치하지 않으면 모순이 발생할 수 밖에 없습니다.

Dog dog = new Dog();
Animal animal = dog;

이렇게 dog를 Animal로도 관리할 수 있어야 하는데,
animal은 외부에서 사용이 불가능하다면 뭔가 이상하겠죠.