본문으로 바로가기

2020/07/23~24 C#

category 스마트팩토리/C# 2020. 7. 23. 21:55
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _2020_07_23
{
    class Program
    {
        delegate int Calculator(int iNum1, int iNum2);

        static int Add(int iNum1,int iNum2)
        {
            return iNum1 + iNum2;
        }
        static int Div(int iNum1, int iNum2)
        {
            return iNum1 / iNum2;
        }
        static int Mul(int iNum1, int iNum2)
        {
            return iNum1 * iNum2;
        }
        static int Sub(int iNum1, int iNum2)
        {
            return iNum1 - iNum2;
        }


        static void Main(string[] args)
        {
            int iResult;
            
            Calculator[] aCalculator = new Calculator[] { Add , Sub, Mul, Div };

            for (int i = 0; i < aCalculator.Length; ++i)
            {
                
                iResult = aCalculator[i](3, 4);
                Console.WriteLine(iResult);

            }

            Console.WriteLine("////////////////////////////////////////");

            foreach (Calculator temp in aCalculator)
            {
                iResult = temp(3, 4);
                Console.WriteLine(iResult);
            }

            Console.WriteLine("////////////////////////////////////////");
            iResult = Add(3, 4);         
            Console.WriteLine(iResult);

            iResult = Sub(3, 4);
            Console.WriteLine(iResult);

            iResult = Mul(3, 4);
            Console.WriteLine(iResult);

            iResult = Div(3, 4);
            Console.WriteLine(iResult);

            


        }
    }
}

delegate를 통해서 메소드를 가르키는 타입을 만들수 있다.
총 3번이 출력된다

한번은 메소드로 호출

한번은 for문으로 호출 (원래는 delegate를가 없었으면 불가능)

한번은 foreach문으로 호출

 

이 구문에서 delegate를 사용하는 법이 나온다 

보고 이해하기 바란다.

여기서 좀 더 새련된걸 보여주겠다

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

public class Mathematics
    {
        delegate int CalcDelegate(int x, int y);

        static int Add(int x, int y) { return x + y; }
        static int Subtract(int x, int y) { return x - y; }
        static int Multiply(int x, int y) { return x * y; }
        static int Divide(int x, int y) { return x / y; }

        CalcDelegate[] methods;

        public Mathematics()
        {
            methods = new CalcDelegate[] { Mathematics.Add, Mathematics.Subtract, Mathematics.Multiply, Mathematics.Divide };

        }

        public void Calculate(char opCode, int operand1, int operand2)
        {
            switch(opCode)
            {
                case '+':
                    Console.WriteLine("+: " + methods[0](operand1, operand2));
                    break;
                case '-':
                    Console.WriteLine("-: " + methods[1](operand1, operand2));
                    break;
                case '*':
                    Console.WriteLine("*: " + methods[2](operand1, operand2));
                    break;
                case '/':
                    Console.WriteLine("/: " + methods[3](operand1, operand2));
                    break;

            }
        }
    }


namespace ConsoleApp1
{
    class Program
    {
        delegate void WorkDelegate(char arg1, int arg2, int arg3);


        static void Main(string[] args)
        {
            Mathematics math = new Mathematics();
            WorkDelegate  Work= math.Calculate;

            Work('+', 10, 5);
            Work('-', 10, 5);
            Work('*', 10, 5);
            Work('/', 10, 5);
        }
    }
}

결과물은 위와 같으나 유지 보수나 관리하기에 좋은 코드를 보여주겠다

좀더 복잡하기는 내용을 추가하거나 삭제할때 아주 간편하고 좋다

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

delegate int CalcDelegate(int x, int y);

class MessageMap
{
    public char opCode;
    public CalcDelegate Calc;

    public MessageMap(char opCode, CalcDelegate Calc)
    {
        this.opCode = opCode;
        this.Calc = Calc;

    }
}
public class Mathematics
    {
        
        MessageMap[] aMessageMap;
        
        static int Add(int x, int y) { return x + y; }
        static int Subtract(int x, int y) { return x - y; }
        static int Multiply(int x, int y) { return x * y; }
        static int Divide(int x, int y) { return x / y; }
        static int Per(int x, int y) { return x % y; }


    public Mathematics()
        {
           
            aMessageMap = new MessageMap[] {
                new MessageMap('+', Add),
                new MessageMap('-', Subtract),
                new MessageMap('*', Multiply),
                new MessageMap('/', Divide),
                new MessageMap('%', Per)
            };
        }

        public void Calculate(char opCode, int operand1, int operand2)
        {
        
            Console.Write(opCode + " : ");
            foreach (MessageMap Temp in aMessageMap)
            {
                if (Temp.opCode == opCode)
                {
                    Console.WriteLine(Temp.Calc(operand1, operand2));
                }

            }


        }
    }


namespace ConsoleApp1
{
    class Program
    {
        delegate void WorkDelegate(char arg1, int arg2, int arg3);


        static void Main(string[] args)
        {
            Mathematics math = new Mathematics();
            WorkDelegate  Work= math.Calculate;

            Work('+', 10, 5);
            Work('-', 10, 5);
            Work('*', 10, 5);
            Work('/', 10, 5);
            Work('%', 10, 5);
        }
    }
}

'스마트팩토리 > C#' 카테고리의 다른 글

2020/7/28 C#  (0) 2020.07.28
2020/07/27 C#  (0) 2020.07.27
2020/7/22 C#  (0) 2020.07.22
2020/07/15 C#  (0) 2020.07.15
2020/07/01 C#  (0) 2020.07.01