가상 메소드와 봉인
런타임에 객체의 실제 타입을 찾는 동적 바인딩(Dynamic Binding)의 원리는 다음과 같다.
-
가상 메소드와 재정의: 기본 클래스에서 확장 가능성을 열어두고, 파생 클래스에서 이를 구체화하는 매커니즘이다.
- 내부 동작: 가상 함수 테이블을 통해 런타임에 어떤 메소드를 호출할지 결정하는 과정이 있다.
-
메소드 은닉: override 키워드와 달리 부모의 기능을 대체하는 것이 아닌 이름만 같은 새로운 메소드를 정의한다.
-
봉인 클래스와 메소드: 더 이상의 상속이나 재정의를 막아 설계의 의도를 고정한다.
- 성능 이점: 가상 함수 테이블 참조를 생략할 수 있어 실행 속도가 미세하게 향상된다.
추상 클래스와 인터페이스
어떻게 구현하는가가 아닌 무엇을 설계하는가에 대한 내용은 다음과 같다.
-
추상 클래스: is-a 관계를 나타내며, 기본적인 기능을 가지면서 일부만 자식에게 맡길 때 사용한다. 필드를 가질 수 있어 상태를 공유해야 하는 클래스 계층 구조에 적합하다.
-
인터페이스: can-do 행위를 나타내며, 클래스가 갖춰야 할 규격만 정의한다.
- 다중 상속의 해법: C# 언어는 클래스 중복 상속을 금지하지만, 인터페이스는 여러 개 구현할 수 있다.
-
기본 인터페이스 구현: C# 8.0 이후 인터페이스도 기본 구현체를 가질 수 있다. 이 기능이 추상 클래스와의 경계를 모호하게 만들었다.