제로의영역

11.3 일반화 클래스 본문

C#

11.3 일반화 클래스

아이큐제로 2019. 12. 30. 15:46

* 본 블로그 글은 머리가 아~~~주 나쁜 왕X100초보가 프로그래밍을 공부하면서 정리를 위해 작성하는 글입니다. 잘못 정리되거나 제가 잘못 이해한 글은 이해 및 조언 부탁드립니다.

* 공부는 '이것이 C#이다' 책을 보고 하고 있습니다. 참고로 저같은 왕초보가 보기 어렵게 써져 있어서 별도의 정리 문서를 만들게 되었습니다.

 

1. 정의: 데이터 형식을 일반화한 클래스

 

2. 목적: 특수한 개념으로부터 공통된 개념을 찾아 묶어 프로그래밍을 간략화.

 

3. 사용방법

class 클래스이름 <형식 매개 변수>
	{
    	//...
    }

  

4. 사용 예

 

다음 코드에서 Array_Int와 Array_Double은 똑같은 기능을 하는 클래스이지만, 내부적으로 사용하는 데이터 형식이 다르기 때문에 두 개의 클래스로 분리해서 구현.

class Array_Int
{
	private int[] array;
    //...
    public int GetElement( int index ) { return array[index]; }
 }
 
 class Array_Double
 {
 	private double[] array;
    //...
    public double GetElement( int index ){ return array[index];}
 }

 

 위의 코드를 일반화를 통해 개선

class Array_Generic<T>
{
	private T[] array;
    //...
    public T GetElement( int inedex ){return array[indext];}
 }

클래스 이름 뒤에 <T>(형식 매개 변수)를 붙이고 데이터 형식 int와 double에 T를 입력.

 

Array_Generic 클래스는 다음과 같이 사용.

Array_Generic<int> intArr = new Array_Generic<int>();
Array_Generic<double> dblArr = new Array_Generic<double>();

사용할 때는 원하는 데이터 형식을 통해 변수를 선언하여 사용.

 

예제)

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

namespace _11._2
{
    class MyList<T> //MyList 클래스에 형식 매개 변수 T를 추가했습니다.
    {
        private T[] array;
        public MyList()
        {
            array = new T[3];
        }
        public T this[int index]
        {
            get
            {
                return array[index];
            }

            set
            {
                if(index>=array.Length)
                {
                    Array.Resize<T>(ref array, index + 1);
                    Console.WriteLine($"Array Resized:{array.Length}");
                }

                array[index] = value;
            }
        }
        public int Length
        {
            get { return array.Length; }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            MyList<string> str_list = new MyList<string>();
            str_list[0] = "abc";
            str_list[1] = "def";
            str_list[2] = "ghi";
            str_list[3] = "jkl";
            str_list[4] = "mno";

            for (int i = 0; i < str_list.Length; i++)
                Console.WriteLine(str_list[i]);
            Console.WriteLine();

            MyList<int> int_list = new MyList<int>();
            int_list[0] = 0;
            int_list[1] = 1;
            int_list[2] = 2;
            int_list[3] = 3;
            int_list[4] = 4;

            for (int i = 0; i < int_list.Length; i++)
                Console.WriteLine(int_list[i]);
        }
    }
}

실행결과

Array Resized:4
Array Resized:5
abc
def
ghi
jkl
mno

Array Resized:4
Array Resized:5
0
1
2
3
4

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

11.1 일반화 프로그래밍 & 11.2 일반화 메소드  (0) 2019.12.27
10.10 foreach가 가능한 객체 만들기  (0) 2019.12.26
10.9 인덱서  (0) 2019.11.18
10.8 컬렉션을 초기화하는 방법  (0) 2019.09.19
10.6 가변 배열  (0) 2019.08.09