C#과 Java언어 비교(7) - Polymorphism

C# and JAVA 2007. 5. 29. 11:05

http://genamics.com/developer/csharp_comparative_part8.htm


11. 다형성(Ploymorphism)

가상 메소드(virtual method)는 객체지향 언어가 다형성을 표현할 수 있도록 해준다. 이것은 파생 클래스가 기반 클래스에 있는 메소드와 동일한 시그너처를 가진 메소드를 작성할 수 있으며, 기반 클래스에서 파생 클래스의 메소드를 호출할 수 있다는 것을 의미한다. 기본적으로 Java에서는 모든 메소드가 가상이다. C#에서는 C++에서와 같이 virtual 키워드를 사용하여야만 메소드를 기반 클래스에서 호출될 것이다.

C#에는 그뿐만 아니라 기반 클래스의 메소드를 재정의해야할(혹은 추상 메소드를 구현해야 하는) 메소드에는 override 키워드를 지정할 필요가 있다

Class B {
    public virtual void foo () {}
}

Class D : B {
    public override void foo () {}
}

메소드가 의도적으로 기반 클래스의 메소드를 숨김을 의미하는 “new” 키워드를 선언에 추가하지 않은채로 비가상 메소드를 재정의하려고 하게 되면 컴파일 타임 에러가 발생하게 될 것이다.
Class N : D {
    public new void foo () {}
}

N n = new N ();
n.foo(); // calls N's foo
((D)n).foo(); // calls D's foo
((B)n).foo(); // calls D's foo

C++과 Java에서와는 대조적으로 override 키워드를 필요로 하는 것은 소스코드를 볼 경우 어떤 메소드가 재정의 되었는지 좀 더 명확하게 알 수 있도록 해준다. 그러나 가상 메소드를 사용하는 것에는 나름 장점과 단점이 있다. 가상 메소드를 사용하는 것의 첫번째 장점은 가상 메소드를 명시하지 않는 것 보다 수행 속도가 조금 더 향상된다는 점이다. 두 번째 장점은 어떤 메소드가 재정의될지가 명확해 진다는 점이다. 그러나 이러한 장점이 곧 단점이 될 수 있다. 기본 옵션으로 Java에서 final 한정자를 두는 것과 C++에서 virtual 한정자를 두는 것을 비교해 보자. Java에서의 기본 옵션은 여러분의 프로그램이 다소 비효율적으로 실행되게끔 할 수도 있으며, 반면에 C++에서는 비록 예상치 못한 일일지라도 기반 클래스의 구현으로 인해 확장성이 제한될 수 있다.
: