[CS] 메모 13. 일반화

윤대희님의 강의 19강

<일반화>(Generalization)

일반화 : 데이터 타입에서 연광성있는 2가지 이상의 개체 집합을 묶어내는 것.

  • 데이터 타입이 다른 변수를 출력해야한다면, 여러 코드를 중복해서 적어야함.
  • 그런 코드중복현상을 최소화 하는 기법

일반화 구조

한정자 반환형식 일반화이름<T> (T 매개변수)
{
	코드 1;
    코드 2;
    코드 3;
    ...
    return 반환값
}

일반화 메서드

T를 이용해서 서로 다른 데이터 형식의 메서드를 일반화 할 수 있음.

private void general<T>(T value) // 일반화 함수 생성
{
	Console.WriteLine(value); // 일반화 T value를 print힘.
}

private void Form1_Load(object sender, EventArgs e)
{
	int[] one = {1, 2, 3};
    string two = "일반화";
    double three = 45.6;
    bool four = true;
    
    foreach(int num in one) general<int>)(num);
    general<string>(two);
    general<double>(three);
    general<object>(four);
}
// 출력값 : 1/2/3/3/일반화/45.6/True
  • Tip : 배열의 경우 각 원소를 출력해야함
  • Tip : object는 모든변수의 최상위 단위임.

일반화 클래스

T를 이용하여 서로 다른 데이터형식의 클래스를 일반화할 수 있음.

class general_class<T> // 제너럴 클래스 선언
{
	public T[] array; // 제너럴 타입 배열
    public int size;
    
    public general_class(int size)
    {
    	array = new T[size]; // 제너럴 타입의 새로운 배열 생성
    }
}

private void Form1_Load(object sender, EventArgs e)
{
	general_class<int> list1 = new genera_class<int>(1);
    general_class<string> list2 = new genera_class<string>(2);
    general_class<object> list3 = new genera_class<object>(3);
    
    list1.array[0] = 1;
    
    list2.array[0] = "one";
    list2.array[1] = "two";
    
    list3.array[0] = 23.456;
    list3.arrya[1] = "thrre";
    list3.array[2] = true;
    
    Console.WriteLine(list1.array[0]);
    
    Console.WriteLine(list2.array[0]);
    Console.WriteLine(list2.array[1]);
    
    Console.WriteLine(list3.array[0]);
    Console.WriteLine(list3.array[1]);
    Console.WriteLine(list3.array[2]);
}
// 출력값 : 1/one/two/23.456/three/True

제약조건 where:T

모든 형식에 대응가능하지만,특정조건에만 만족하는 경우에만 사용할 수 있도록 제한을 할 수 있음.

where 형식매개변수 : 제약조건
    1. where T:struct : T는 값 형식으로 제한
    1. where T:class : T는 참조 형식으로 제한
    1. where T:new() : 매개변수가 없는 생성자로 제한
    1. where T:기반 클래스 이름 : 기반클래스의 파생 클래스로 제한
    1. where T: 인터페이스 이름 : 명시한 인터페이스로 제한
    1. whrere T: U : 다른형식 매개변수 U로부터 상속받은 클래스로 제한
private void general<T>(T value) where T : struct
{
	Console.WriteLine(value); // 일반화 T value를 print힘.
}

private void Form1_Load(object sender, EventArgs e)
{
	int[] one = {1, 2, 3};
    string two = "일반화";
    double three = 45.6;
    bool four = true;
    
    foreach(int num in one) general<int>)(num);
    // general<string>(two);
    general<double>(three);
    // general<object>(four);
}
// 출력값 : 1/2/3/45.6/
  • 값형식 제한으로 인해 string, bool 타입은 못씀.

좋은 웹페이지 즐겨찾기