[C#] 덕타이핑과 dynamic

c# 2023. 1. 6. 10:17
728x90

인터페이스를 설계하기 위해서는 추상화를 잘해야 하는데 추상화를 잘하려면 연습과 경험이 많이 필요하다

인터페이스를 잘못 설계했다가 나중에 파생 클래스를 수정해야 할 일이 생기면 위로는 인터페이스를 수정하고 아래로는 자신의 파생 클래스들, 옆으로는 형제 클래스들을 줄줄이 수정해야 하는 일이 생긴다.

덕타이핑은 이런 문제를 만났을 때 좀 더 유연하게 해결할 수 있도록 돕는다

상속 관계를 이용하지 않기 때문에 프로그램의 동작에 관여하는 부분만 손을 대면 된다

 

using System;
using System.Text;
using System.Threading.Tasks;

namespace DuckTyping
{

    class Duck
    {
        public void Walk()
        {
            Console.WriteLine(this.GetType() + ".Walk");
        }
        public void Swim()
        {
            Console.WriteLine(this.GetType() + ".Swim");
        }
        public void Quack()
        {
            Console.WriteLine(this.GetType() + ".Quack");
        }
    }

    class Mallard : Duck
    {

    }

    class Robot
    {
        public void Walk()
        {
            Console.WriteLine("Robot.Walk");
        }
        public void Swim()
        {
            Console.WriteLine("Robot.Swim");
        }
        public void Quack()
        {
            Console.WriteLine("Robot.Quack");
        }
    }

    class MainApp
    {
        static void Main(string[] args)
        {
            dynamic[] arr = new dynamic[] { new Duck(), new Mallard(), new Robot() };

            foreach (dynamic duck in arr)
            {
                Console.WriteLine(duck.GetType());
                duck.Walk();
                duck.Swim();
                duck.Quack();

                Console.WriteLine();
            }
        }
    }

 

 

컴파일러가 dynamic 키워드를 만나면 프로그램을 실행할 때 형식 검사를 하도록 미룬다

 

class MyClass
{
	public void FuncAAA()
    {
    	//Do Nothing
    }
}

class MainApp
{
	static void Main(string[] args)
    {
    	dynamic obj = new MayClass();
        obj.FuncAAA();
        obj.FuncBBB();	/*FuncBBB() 메소드를 선언하지 않았지만 obj가 dynamic으로 선언되어서
        컴파일러 형식 검사를 피해간다*/
    }
}

 

 

 

 

728x90

'c#' 카테고리의 다른 글

[C#] DataTable  (0) 2023.01.06
[C#] dynamic 동적 형식  (0) 2023.01.06
[C#] Interface  (0) 2023.01.05
[C#] 순수 함수  (0) 2023.01.04
[C#] 함수형 프로그래밍  (0) 2023.01.04
Posted by 바르마스
,