none
오버라이드 질문 RRS feed

  • 질문

  • Virtual 로 부모 함수를 만들고

    다른클래스에서 상속을 시킨다음 override 로 똑같은 자식 함수를 만들어서 사용하는것은

    말그대로 똑같은 이름에 함수를 다른용도로 사용하고 싶을때 사용하는것인가요?

    맞는지 아닌지 알고싶습니다. 언제쓰이고 virtual 과 override를 무슨형이라고 부르는건가요?

    2015년 11월 29일 일요일 오후 12:49

답변

  • 모든 객체지향 책들에 보면 빠지지 않고 등장하는 것이 바로 다형성입니다. 말이 어려워서 그렇지 예를 들어보면 금방 이해가 됩니다. 예를 들어 다음의 코드가 있을 때,

    class Parent
    {
       public void Do() { Console.WriteLine("Parent"); }
    }

    class Child : Parent
    {
       public void Do() { Console.WriteLine("Child"); }
    }

    이렇게 코드를 사용하면 뭐라고 찍혀야 할까요?

    Parent parent = new Child();
    parent.Do();

    단순히 메서드를 하위에서 재정의한 것에 불과하기 때문에 Parent 클래스와 Child 클래스의 Do 메서드는 각각 별개입니다. 따라서 이런 경우 화면에는 "Parent"가 찍힙니다.

    하지만, 때로는 이 둘간에 연관 관계를 맺어주고 싶을 때가 있습니다. 즉 단순히 Do 메서드가 Child에서 독립적으로 정의한 것이 아니고 부모 메서드에 정의된 것을 override(재정의)했음을 알리고 싶은 것입니다. 바로 이럴 때 부모에는 virtual 을 쓰고 child에서는 해당 메서드를 재정의했다고 명시적으로 override를 쓰는 것입니다.

    class Parent
    {
       virtual public void Do() { Console.WriteLine("Parent"); }
    }

    class Child : Parent
    {
       public override void Do() { Console.WriteLine("Child"); }
    }

    Parent parent = new Child();
    parent.Do();  // "Child" 출력

    이런 식의 개념으로 설명하는 예제들이 많이 있습니다. 예를 들어, Draw라는 메서드를 상위 클래스에서 virtual로 정의해놓고 하위 Rectangle, Circle, Line 클래스에서는 해당 메서드를 override로 재정의해서 사용하는 것입니다.

    2015년 11월 30일 월요일 오전 12:00