해결된 질문
작성
·
209
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은 외부에서 사용이 불가능하다면 뭔가 이상하겠죠.