[C# 기초강의] Ch 11. 일반화 프로그래밍

728x90

 

https://www.youtube.com/watch?v=G3Edvvp_YpA&list=PLVsNizTWUw7GN8wPRhclbKuQa9aI9Cj2V&index=12

 

📌 일반화 프로그래밍

◾ 일반화

  • 특수한 개념으로부터 공통된 개념을 찾아묶는 것

 

◾ 일반화 프로그래밍

  • 데이터 형식 일반화를 이용하는 프로그래밍 패러다임
  • 한 가지 코드를 다양한 데이터 형식에 활용

 

◾ 일반화 메서드

  • 데이터 형식을 일반화한 메서드
  • 메서드 이름 뒤에 형식 매개 변수 ( <> ) 를 입력하여 작성
    컴파일 단계에서 형식 매개 변수는 실제 형식으로 지환됨
void CopyArray<T> ( T[] source, Tp[ target )
{
	...   
}
 
int[] cource = { 1, 2, ... 5};
int[] target = new int[5];

CopyArray<int> (source, target);

 

◾ 일반화 클래스

  • 데이터 형식을 일반화한 클래스
  • 클래스 이름 뒤에 형식 매개 변수를 입력하여 작성
class Array_Generic<T>
{
	private T[] Array;
	...
    
    public T GetElement(int index)
    { return array[index]; }
}

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

 

◾ 형식 매개변수 제약

  • 형식 매개변수가 특정 조건을 갖추도록 강제하는 기능
//예제1. 형식 매개변수 T를 MyClass의 파생 클래스로 제약 
class MyList<T> where T : MyClass
{
	... 
}

//예제2. 형식 매개변수 T를 값 형식으로 제약

void CopyArray<T> (T[] source , T[] target) where T : struct
{
	for (int i=0; i < source.Length; i++) 
    	target[i] = source[i];
}

 

◾ where절과 함꼐 사용할 수 있는 제약 조건

제약설명

where T : struct T는 값 형식이어야 함
where T : class T는 참조형식이어야 함
where T : new() T는 반드시 매개변수가 없는 생성자가 있어야 함
*where T : 기반클래스이름** T는 명시한 기반 클래스의 파생 클래스여햐 함
where T : 인터페이스이름 T는 명시한 인터페이스를 반드시 구현해야 함. 여러개의 인터페이스 명시도 가능
where T: U T는 또 다른 형식 매개변수 U로부터 상속받은 클래스여야 함



📌 일반화 컬렉션

  • 컬렉션은 object 형식 기반
  • 컬렉션의 요소에 접근할 때마다 발생하는 박싱 / 언박싱 → 성능 저하
  • 일반화 컬렉션은 형식매개변수를 이용하여 버그와 성능저하를 줄임
    → 컴파일 단계에서 형식매개변수가 특정 형식으로 치환 되기 때문
  • 일반화 클래스는 System.Collections.Genereic 네임스페이스에 위치

◾ List < T >

 

◾ Queue < T >

 

◾ Stack < T >

 

◾ Dictionary < T >

Dictionary <string, string > dic = new Dictionary<string, string>();

// < key , value > 순
728x90