[c#] 다형성을 활용한 디자인 패턴

다형성(Polymorphism)은 객체 지향 프로그래밍에서 중요한 개념 중 하나입니다. 다형성은 같은 인터페이스를 통해 서로 다른 방식으로 동작할 수 있는 객체들을 가리킵니다. 이러한 다형성은 디자인 패턴에서도 중요한 역할을 합니다. 여러 다양한 상황에 대처하기 위해 다형성을 활용하는 다양한 디자인 패턴이 존재합니다.

다형성의 장점

다형성을 활용한 디자인 패턴은 소프트웨어의 유연성과 확장성을 향상시킵니다. 새로운 기능이나 객체가 추가될 때 기존의 코드를 수정하지 않고 확장할 수 있는 장점이 있습니다. 또한, 유닛 테스트 및 유지보수가 용이하며 코드의 재사용성을 높일 수 있습니다.

다형성을 활용한 디자인 패턴 예시

다형성을 활용한 대표적인 디자인 패턴으로는 팩토리 패턴(Factory Pattern), 전략 패턴(Strategy Pattern), 템플릿 메서드 패턴(Template Method Pattern) 등이 있습니다.

팩토리 패턴(Factory Pattern)

public interface IShape
{
    void Draw();
}

public class Circle : IShape
{
    public void Draw()
    {
        Console.WriteLine("Circle is drawn");
    }
}

public class Square : IShape
{
    public void Draw()
    {
        Console.WriteLine("Square is drawn");
    }
}

public class ShapeFactory
{
    public IShape GetShape(string shapeType)
    {
        if (shapeType.Equals("circle", StringComparison.InvariantCultureIgnoreCase))
            return new Circle();
        else if (shapeType.Equals("square", StringComparison.InvariantCultureIgnoreCase))
            return new Square();
        return null;
    }
}

class Program
{
    static void Main(string[] args)
    {
        ShapeFactory shapeFactory = new ShapeFactory();
        IShape shape1 = shapeFactory.GetShape("circle");
        IShape shape2 = shapeFactory.GetShape("square");

        shape1.Draw();
        shape2.Draw();
    }
}

전략 패턴(Strategy Pattern)

public interface IStrategy
{
    void Execute();
}

public class ConcreteStrategy1 : IStrategy
{
    public void Execute()
    {
        Console.WriteLine("Executing strategy 1");
    }
}

public class ConcreteStrategy2 : IStrategy
{
    public void Execute()
    {
        Console.WriteLine("Executing strategy 2");
    }
}

public class Context
{
    private IStrategy _strategy;

    public Context(IStrategy strategy)
    {
        _strategy = strategy;
    }

    public void ExecuteStrategy()
    {
        _strategy.Execute();
    }
}

class Program
{
    static void Main(string[] args)
    {
        Context context = new Context(new ConcreteStrategy1());
        context.ExecuteStrategy();

        context = new Context(new ConcreteStrategy2());
        context.ExecuteStrategy();
    }
}

템플릿 메서드 패턴(Template Method Pattern)

public abstract class AbstractClass
{
    public void TemplateMethod()
    {
        BaseOperation1();
        RequiredOperation1();
        BaseOperation2();
        Hook();
    }

    public void BaseOperation1()
    {
        Console.WriteLine("Base operation 1");
    }

    public void BaseOperation2()
    {
        Console.WriteLine("Base operation 2");
    }

    public abstract void RequiredOperation1();

    public virtual void Hook() { }
}

public class ConcreteClass1 : AbstractClass
{
    public override void RequiredOperation1()
    {
        Console.WriteLine("Concrete class 1: Operation 1");
    }
}

public class ConcreteClass2 : AbstractClass
{
    public override void RequiredOperation1()
    {
        Console.WriteLine("Concrete class 2: Operation 1");
    }

    public override void Hook()
    {
        Console.WriteLine("Concrete class 2: Hook operation");
    }
}

class Program
{
    static void Main(string[] args)
    {
        AbstractClass abstractClass = new ConcreteClass1();
        abstractClass.TemplateMethod();

        abstractClass = new ConcreteClass2();
        abstractClass.TemplateMethod();
    }
}

결론

다형성을 활용한 디자인 패턴은 유지보수성과 유연성을 향상시키며, 객체 지향 소프트웨어 개발에서 중요한 역할을 합니다. 이러한 디자인 패턴들을 적절히 활용하여 소프트웨어를 설계하고 개발하는 것이 중요합니다.

참고 자료: