참고 영상: https://www.youtube.com/watch?v=Is2bdBpncHA&list=PLVsNizTWUw7GN8wPRhclbKuQa9aI9Cj2V&index=9
참고 사이트: https://dev-sm.tistory.com/3
https://russellstudio.tistory.com/24
다중 상속을 허용하면 한 클래스가 두 개 이상의 부모 클래스로부터 동일한 멤버를 상속받을 수 있다.
이 경우, 같은 이름의 멤버를 가지고 있을 때 어떤 부모 클래스의 멤버를 사용해야 하는 지 모호해진다.
클래스 간의 관계가 복잡해져서 관계를 파악하기 어려워지고 코드의 유지 보수성이 저하될 수 있다.
여러 부모 클래스로부터 상속받은 멤버들이 이름이 충돌할 수 있다.
이러한 충돌을 해결하기 위해 충돌하는 멤버를 재정의해야 하거나 명시적으로 부모 클래스를 지정해야 할 수 있다.
C#은 단일 상속을 통해 일관성과 단순성을 유지하고자 한다.
단일 상속을 통해 클래스 간의 관계를 명확하게 만들고 코드의 가독성과 이해도를 높일 수 있다.
인터페이스를 사용하면 다른 클래스에서 해당 인터페이스를 구현하여 동일한 기능을 공유할 수 있다.
인터페이스를 통해 다양한 클래스가 동일한 동작을 수행할 수 있으므로 코드의 재사용성이 향상된다.
C#에서 클래스는 단일 상속만을 지원하지만, 인터페이스는 다중 상속을 지원합니다.
클래스가 여러 인터페이스를 구현함으로써 여러 개의 기능을 조합할 수 있습니다.
인터페이스는 클래스에게 뼈대만 잡아주고 실제 구현은 클래스 내부에서 하기때문에 느슨한 결합이라고 할 수 있다.
클래스와 인터페이스 간에 느슨한 결합을 형성할 수 있다.
클래스는 인터페이스를 구현하기만 하면 되므로, 클래스의 내부 구현에 대한 변경 없이 인터페이스의 동작을 변경하거나 새로운 인터페이스를 추가할 수 있다.
interface 키워드를 이용하여 선언interface의 I로 시작하는 이름으로 명명⚔ 예시
interface ILogger
{
void WriteLog(string log);
}
추상 클래스는 메소드의 구현을 가질 수 있음.(클래스와 같음)
추상 클래스에서 구현을 가지지 않는 메소드를 추상 메소드(Abstract Method)라고 한다.
추상 클래스의 파생 클래스는 추상 메소드를 반드시 구현해야 한다.
추상 클래스는 객체를 생성할 수 없음.(인터페이스와 같음)
인터페이스를 제공하되 기본적인 구현을 함께 제공하고 싶을 경우 사용
abstract class 키워드를 이용하여 선언
구현체를 갖지 않는 메소드는 abstract 한정자로 수식
⚔ 예시
abstract class AbstractBase
{
public abstract void SomeMethod();
}
class Derived : AbstractBase
{
public override void SomeMethod()
{
// Something
}
}
| 비교 | 추상 클래스 | 인터페이스 |
|---|---|---|
| 메서드 구현 | 메서드를 구현할 수 있다. | 메서드 구현을 포함할 수 없다. |
| 다중 상속 | 다중 상속 X | 다중 상속 O |
| 선택 기준 | 공통된 기본 기능을 갖고, 추상 메서드를 사용 | 다중 상속이 필요하고, 구체적인 구현 없이 재정의 할 때 사용 |