방프리

23.05.20 Chapter2. API 설계 (Item 15) 본문

C#/More Effective C#

23.05.20 Chapter2. API 설계 (Item 15)

방프리 2023. 5. 20. 22:06

Item 15 : 인터페이스 메서드와 가상 메서드의 차이를 이해하라

 

인터페이스와 가상 함수를 재정의하는 건 확실히 다르다. 가상 함수는 필수적으로 구현해주어야 하지만 

인터페이스 함수는 그렇지 않기 때문이다.

각각의 방식을 사용한 코드는 다음과 같다.

//인터페이스
interface IMessage
{
	void Message();
}

public class MyClass : IMessage
{
	public void Message() => WriteLine(nameof(MyClass));
}

public class MyDerivedClass : MyClass
{
	public new void Message() => WriteLine(nameof(MyDerivedClass));
    // 해당 함수는 가상함수가 아니므로 new 연산자를 통해 재정의 해주어야 한다.
}

//베이스 클래스에 접근이 안될 때
public class MyClass : IMessage
{
	private void Message() => WriteLine(nameof(MyClass));
}

public class MyDerivedClass : MyClass, IMessage
{
	public new void Message() => WriteLine(nameof(MyDerivedClass));
    // 해당 함수는 가상함수가 아니므로 new 연산자를 통해 재정의 해주어야 한다.
}

//가상 함수
public class MyClass : IMessage
{
	public virtual void Message() => WriteLine(nameof(MyClass));
}

public class MyDerivedClass : MyClass, IMessage
{
	public override void Message() => WriteLine(nameof(MyDerivedClass));
}

//순수 가상 함수
public abstract class MyClass : IMessage
{
	public abstract void Message();
}

public class MyDerivedClass : MyClass
{
	public override void Message() => WriteLine(nameof(MyDerivedClass));
}

//실제 구현 함수와 호출 함수를 분리
public class MyClass : IMessage
{
	protected virtual void OnMessage()
    {
    }
    
    public void Message()
    {
    	OnMessage();
    }
}

 각각 구현하는 방법은 상황, 목적 그리고 어떻게 관리할 것인가에 따라 채택하면 좋을 듯 싶다. 

개인적인 생각이지만 순수관리목적이라면 인터페이스가 가상함수보다 좀 더 매력적이지 않을까 싶다.

Comments