오옷! 추상클래스와 인터페이스 토론이군요ㅇㅅㅇ! 꿀잼각ㅋㅅㅋ
저도 여기 살짝 거들어 보자면…
추상클래스와 인터페이스 모두 다형성 제공이라는 목적을 가지고는 있지만
둘의 방향성은 약간 다릅니다.
추상클래스(일반 클래스를 포함하여) 는 말 그대로 상속과 파생의 개념을 통하여
부모 타입의 내용을 물려받고 자식 클래스는 부모의 타입으로 사용될 수 있음을 의미 합니다.
이것은 전통적인 타입 시스템을 가진 언어에서 일반적인 형태이죠.
타입 간 부모 자식 관계를 형성하는 방식으로 다형성을 제공합니다.
반면
다중 상속을 금지하는 C# 에서는
기능의 구현 여부에 따라 다형성을 제공하기 위해 인터페이스를 지원합니다.
이는 일종의 “Duck Typing” 을 제공하기 위한 수단인 것이죠.
(사실상 C# 의 인터페이스는 이 의미가 강합니다.)
따라서 인터페이스는 타입 간 상하/종속 관계의 의미가 아니라
대상 인터페이스가 정의하는 내용을 구현할 경우, 해당 인터페이스 타입으로 인정하겠다… 라는 의미로 사용됩니다.
사실 이거 혼란스러울 수 있다고 생각하는데요.
제가 생각하기에 그 원인 중 하나가 클래스의 상속과 인터페이스의 구현을 표기하는 방식이 동일해서라고 생각해요.
public class Foo : Bar
{
}
public class Foo : IBar
{
}
이렇게 인터페이스 클래스의 다형성 제공 방법이 동일한 방식으로 표시되는 문법이다보니
이 둘을 다 “상속” 이라고 표현하면서 이런 혼란이 생긴다고 보는 편이에요.
엄밀히 말하자면
클래스는 부모의 것을 물려받고 부모인척 하는 방식의 “상속과 파생” 이고
인터페이스는 정한 걸 구현했을 때 같은 타입으로 인정해주겠다는 “계약과 구현” 의 관계라고 봐야합니다.
여기에 추상클래스는 상속의 개념을 유지하면서 계약의 의미를 좀 더 강화한 형태로 제공되는 것이죠.
그런데 이제 인터페이스도… 기본 구현이 들어가면 약간 상속 같은 개념이 추가되었다고 봐야할까 싶긴하네요…