본문 바로가기
카테고리 없음

일반화(Generic)

by do_ng 2023. 11. 11.

일반화 프로그래밍이란?

특수한 개념으로부터 공통된 개념을 찾아 묶는 방법을 일반화라고 한다.

사람, 돼지, 고래, 오리너구리는 사는 곳이 다르다. 사람과 돼지는 땅 위에서 생활하고 고래는 물속에서 생활하고 오리너구리는 땅과 물 양쪽에서 생활한다. 번식 방법도 다른데 사람, 돼지,고래는 새끼를 낳지만 오리너구리는 알을 낳는다. 

이렇게 각자 다른 특징을 갖는 동물이지만, 새끼에게 수유라는 것을 통해 양분을 공급하는 방식이 동일하므로 이들을 묶는 공통 개념을 포유류 라고 한다. 

 

프로그래밍에서 일반화(Generic)는 데이터 형식을 의미한다. 

만약에 제네릭을 사용하지 않고 데이터를 복사하는 메소드를 만든다고 했을 때 데이터의 타입이 달라지는 경우 그에 맞춰서 새로운 메소드를 만들어줘야 된다. 

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

namespace Test
{
    internal class Program
    {
        static void CopyInt(int[] source, int[] target)
        {
            for (int i = 0; i < source.Length; i++)
                target[i] = source[i];
        }

        static void CopyChar(char[] source, char[] target)
        {
            for (int i = 0; i < source.Length; i++)
                target[i] = source[i];
        }
        
        static void Main(string[] args)
        {
            int[] source = { 1, 2, 3 };
            int[] target = new int[source.Length];
            CopyInt(source, target);

            char[] source2 = { 'A', 'B', 'C' };
            char[] target2 = new char[source.Length];
            CopyChar(source2, target2);
        }
    }
}

 

 

메소드 내부의 코드가 동일하고 데이터 타입만 달라지는 경우 제네릭을 사용해서 코드의 양을 줄일 수 있다.

메소드 호출 부분에서 CopyArray<T>(홑화살괄호)안에 T의 데이터 타입을 지정해줘야 한다.

<T> 안의 지정된 타입에 맞춰서 컴파일러는 메소드의 나머지 부분에 대해서도 T를 지정된 타입으로 치환한다.

* T는 Type Parameter 약자로 보통 T라고 씀

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

namespace Test
{
    internal class Program
    {
        static void CopyArray<T> (T[] source, T[] target)
        {
            for(int i = 0; i < source.Length; i++)
                target[i] = source[i];
        }

        static void Main(string[] args)
        {            
            int[] source = {1, 2, 3 };
            int[] target = new int[source.Length];
            CopyArray<int>(source, target);

            char[] source2 = { 'A', 'B', 'C' };
            char[] target2 = new char[source.Length];
            CopyArray<char>(source2, target2);
        }
    }
}