본문 바로가기

카테고리 없음

20200818 정처기때문에 간만에 하는 C#코딩( GENERIC)

반응형
using System;

class Program
{
    static void ArrayPrint<FACT>(FACT[] Num)
    {
        for (int Temp = 0; Temp < Num.Length; ++Temp)
        {
            Console.Write("{0} ", Num[Temp]);
        }
        Console.WriteLine();
    }
  
    static void Main(string[] args)
    {
        int[] Numbers1 = { 1, 3, 5, 7, 9 };
        double[] Numbers2 = { 1.1, 3.1, 5.1, 7.1, 9.1 };
        string[] Numbers3 = { "일", "이" };
        ArrayPrint<int>(Numbers1);
        ArrayPrint<double>(Numbers2);
        ArrayPrint<string>(Numbers3);

    }

변수의 타입을 일반화 시켜주는 

근대 강사님이 상대성 이론을 말씀하신다. 

상대성이론에는 일반과 특수가 있다 !

특수보다 일반이 정의하기 힘들다  

위 제네릭 문법은 사용자가 사용하긴 쉬워도 만들긴 어렵다 !

 

타입만 빼고 다 중복이 일어난다 ! 내용은 동일 

이경우 너무 비효율적이다. 그러면 어떻게하느냐 타입별로 변신하도록 만들면 되지 않겠냐 

컴파일러가 대신 내가 할 코딩 업무를 처리해준다! 

마지막에 내가 메서드를 호출하는 자리에서 FACT 내용을 바꿔준다!

인간이 하지말고 컴파일러가 잘하니까 컴파일러 시키자 

바꿔줄 부분만 바꿔주자 

실제로는 성능에서 차이가 나지 않는다. 

만드는 시간이 훨씬 짧게 걸린다. 

 

문법만 공부해서 적용하면 인간이 하는것 처럼 컴파일러가 하게끔 일을 시킬 수 있고 

훨씬 빠른 시간안에 할 수 있다. 

이런걸 제네릭 프로그래밍이라고 한다. 

메소드에 적용가능하고 클래스에도 적용가능하다. 

타입마다 바뀌는 부분이있을거 아니예요 

 

보통 FACT 자리에 T라고 많이들 적는다! 

아무 글자나 서도 되는데 다른 글자랑 겹치면 안된다. 

<T> 가들어가는 자리가 중요하다!

 

메소드, 클래스 이름 끝에 그리고 () 앞에 적으면 된다.

아진짜 정처기하다가 코딩하니까 너무 즐겁네 

빨리 알고리즘 관련해서도 공부를 해야하는데 

인타운 대표님이 매일매일 있는 회의에서도 내용을 기록하는게 중요하다고 했다. 

 

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

namespace ConsoleApp1
{
    class Program
    {
        static void ArrayPrint<T>(T[] Num)
        {
            for (int Temp = 0; Temp < Num.Length; ++Temp)
            {
                Console.Write("{0} ", Num[Temp]);
            }
            Console.WriteLine();
        }
        static void Main(string[] args)
        {
            int[] ArrayINT1 = { 2, 4, 6, 8 }; // 값 new 예약어 없이도 힙영역에 자리 만들어줌!
            int[] ArrayINT2 = new int[4];
            ArrayPrint<int>(ArrayINT1);
            ArrayPrint<int>(ArrayINT2);
        }
    }

힙은 모든 영역이 0으로 차있다. 

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

namespace ConsoleApp1
{
    class Program
    {
        static void ArrayCopy<T>(T[] Dst, T[] Src)
        {
            for (int i = 0; i < Dst.Length; i++)
            {
                Dst[i] = Src[i];

            }

        }
  

        static void ArrayPrint<T>(T[] Num)
        {
            for (int Temp = 0; Temp < Num.Length; ++Temp)
            {
                Console.Write("{0} ", Num[Temp]);
            }
            Console.WriteLine();
        }
        static void Main(string[] args)
        {
            int[] ArrayINT1 = { 2, 4, 6, 8 }; // 값 new 예약어 없이도 힙영역에 자리 만들어줌!
            int[] ArrayINT2 = new int[4];    // 위에는 생략한 것이다.


            ArrayCopy(ArrayINT2, ArrayINT1);
            ArrayPrint<int>(ArrayINT2);


            double[] ArrayDouble1 = { 2.1, 4.1, 6.1, 8.1 }; // 값 new 예약어 없이도 힙영역에 자리 만들어줌!
            double[] ArrayDouble2 = new double[4];    // 위에는 생략한 것이다.


            ArrayCopy(ArrayDouble2, ArrayDouble1);
            ArrayPrint<double>(ArrayDouble2);




        }


    }
}

 인자 여러개일 경우 

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

namespace ConsoleApp3
{
    class Program
    {
        static void TwoPrint<T1,T2>(T1 a, T2 b)
        {
            Console.WriteLine(a);
            Console.WriteLine(b);

        }
        static void Main(string[] args)
        {
            TwoPrint("헬로우", 2.1f);
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp4
{
    class FACT<T>
    {
        public T Value;
        

        public void Print()
        {
            Console.WriteLine($" FACT Value = {Value}");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            FACT<int> fACT = new FACT<int>();
            fACT.Value = 100;
            fACT.Print();
            
        }
    }
}
ng System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices.ComTypes;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp4
{
    class FACT<T1,T2>
    {
        public T1 Value1;
        public T2 Value2;


        public void Print()
        {
            Console.WriteLine($" FACT Value = {Value1},{Value2}");
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            FACT<int,string> fACT = new FACT<int,string>();
            fACT.Value1 = 100;
            fACT.Value2 = "안녕하세요";
            fACT.Print();

           
        }
    }
}
반응형