'다형성'에 해당되는 글 1건

  1. 2007.09.23 레퍼런스와 상속
Study - Programming/C#2007. 9. 23. 22:18

다음 그림을 한번 보자.

사용자 삽입 이미지

위 그림의 코드를 보면 Chile 클래스는 Parent 클래스를 상속받아 있다. 그리고 Child는 Parent의 Show() 메서드를 오버라이드 했고, 추가로 Func()라는 메소드를 가지고 있다.

그럼 이젠 Main() 함수를 보자. 처음에는 Parent 형으로 obj라는 객체를 만들고 Parent 인스턴스를 만들어 참조했다.  물론 이 상태에서 Show를 하면 Parent의 Show()가 실행된다.
그럼 다음 줄로 넘어가 obj를 Child인스턴스에 참조시켜 보자. 물론 Show()메서드는 Child의 Show()가 실행된다. 그런데 그 다음줄로 넘어가 Func()를 실행시키려 시도해 보자. 일단 위 그림에서 자동완성의 목록에는 Func()가 없다. 그냥 무시하고 Func()를 타이핑해서 빌드 해 보자.
사용자 삽입 이미지
  위 그림을 보면 오류가 나온다. 간단히 테스트의 목적으로 만든 코드인데 한번 자세히 알아보자.

  우선 obj라는 객체는 Parent형으로 되어 있다. 즉 Parent의 틀을 가지고 있다는 것이다. 그러므로 obj = new Parent();로 해 놓으면 당연히 Parent의 모든 메서드를 사용하는 것이 가능하다.
  그러나 obj = new Child();로 해 놓으면 어떨까? obj의 '틀'은 Parent이다. 그런데 참조한 인스턴스는 Child이다. Child는 어떻게 되어 있는가? Parent를 상속받아 놓고 거기다 Show()를 오버라이드 한 다음 Child만의 Func()를 포함하고 있다. 즉 Parent라는 '틀'은 Child가 상속받고 있는 Parent관련 멤버들 및 오버라이드 함수만 레퍼런스 할 수 있고, Child만의 멤버인 Func는 사용할 수 없다는 이야기이다.
  솔직히 이게 무엇을 의미하는지 결론적으로는 잘 모르겠다. 다만 이런 식의 코드를 많이 보아 왔었는데 이게 어떻게 성립하는지 이해가 안되었다가 이해를 할 수 있게 되었다.
  폴리모피즘은 OOP에서도 어려운 개념이라고 들었다. 나도 다른 개념은 충분히 사용해 보면서 할 수 있겠는데 이 부분은 영 난해해서 힘들다. 공부를 더 해봐야 겠다.
Posted by 머리