일반화 프로그래밍 – 이것이 C# 이다.
C# 은 프로그래머가 작성한 하나의 코드가 여러 가지 데이터 형식에 맞춰 동작할 수 있도록 하는 일반화 프로그래밍을 지원한다.
이는 코드의 생산성을 좌우하는 아주 중요한 방법이다.
일반화 Generalization
: 특수한 개념으로 부터 공통된 개념을 찾아 묶는 것.
C# 은 “ 데이터의 형식 [DataType] ” 으로 일반화를 할 수 있다.
예를 들어 정수형 배열을 복사하는 기능이 필요하여 메소드를 작성하였다.
static void CopyArray( int[] source, int[] target) { for (int i = 0; i < source.Length; i++) { target[i] = source[i]; } }
이번에는 문자열 배열을 복사하는 기능이 필요하다면?
CopyArray() 메소드에 오버로딩을 하면 된다.
static void CopyArray(string[] source, string[] target) { for (int i = 0; i < source.Length; i++) { target[i] = source[i]; } }
하지만 추후에 float 배열을… 또 AClass를 복사해야 한다면? 나중에 BClass?
무수히 많은 오버로딩 메소드가 작성될 것이다.
위의 예들은 매개변수에 입력되는 배열의 형식만 다를 뿐이므로 우리는 일반화 할 수 있다.
위의 예시는 아래와 같이 일반화 될 수 있다.
구체적인 형식의 이름 대신에 T : 형식 매개변수(Type Paramerter) 가 들어간다.
static void CopyArray<T>(T[] source, T[] target) { for (int i = 0; i < source.Length; i++) { target[i] = source[i]; } }
주의할 사항은 컴파일할 떄 T 가 구체적으로 어떤 형식인지 컴퓨터에게 정의해 줘야 한다는 것
배열을 복사하는 메소드의 일반화 예시
using System; namespace ConsoleApplication1 { public class Copyclass { public Copyclass() { } } class MainApp { 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 형식 int[] source = { 1, 2, 3, 4, 5 }; int[] target = new int[source.Length]; CopyArray<int>(source, target); foreach (int element in target) { Console.WriteLine(element); } // string 형식 string[] source2 = { "하나", "둘", "셋", "넷", "다섯" }; string[] target2 = new string[source2.Length]; CopyArray<string>(source2, target2); foreach (string element in target2) { Console.WriteLine(element); } // Class 형식 Copyclass copyclass1 = new Copyclass(); Copyclass copyclass2 = new Copyclass(); Copyclass[] source3 = { copyclass1, copyclass2 }; Copyclass[] target3 = new Copyclass[source3.Length]; CopyArray<Copyclass>(source3, target3); foreach (Copyclass item in target3) { Console.WriteLine(item.ToString()); } } } }
해당 형식의 배열을 만드는 클래스가 있다.
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_Gereric<T> { private T[] array; public T GetElement(int index) { return array[index]; } }
위의 일반화된 클래스는 아래와 같이 사용 가능하다
Array_Gereric<int> intArr = new Array_Gereric<int>(); Array_Gereric<double> doubleArr = new Array_Gereric<double>();
클래스 일반화 예시
using System; namespace Generic { class 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 MainApp { 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]); } } } }
Hey! Do you know if they make any plugins to help with
Search Engine Optimization? I’m trying to get my website to rank for some targeted
keywords but I’m not seeing very good gains. If you know of any please share.
Appreciate it! You can read similar blog here: Eco product