-
[C#] 일반화(2)C# 2022. 1. 25. 10:38728x90
저번시간에 이어 일반화에 대해 좀 더 알아보겠습니다.
저번에는 특정 메소드에 대해서만 일반화를 진행했는데 이번에는 Class자체의 일반화,
그리고 일반화에 대한 제한사항 설정에 대해 알아보겠습니다.
Class의 일반화 사용방법은 간단합니다.
class 클래스이름 <형식 매개변수>
{
//
}
이런 구조입니다.
class 일반화는 어디서 사용할까요? 한가지 예시 코드를 보여드리겠습니다.
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]; } }
입력받은 index값을 통해 특정한 위치의 array값을 리턴해준다는 공통점이 있는 코드들입니다.
그러나 자료형이 달라서 결국은 다른 클래스로 정의하게 됐네요.
class를 일반화 시킨 형태입니다. 자료형에 T를 치환해 준걸 확인하시면 되겠습니다.
class Array_Generic<T> { private T[] array; public T GetElement(int index) { return array[index]; } }
이렇게 사용하시면 되겠습니다.
메인구성은 객체 생성하듯 사용하시면 되겠습니다.
다만 <T>를 대처 할 수 있는 자료형을 넣어준다는 점을 주목하시면 되겠습니다.
실제로는 array를 메소드 안에 정의해 구현결과는 찾을 수 없겠네요.
static void Main(string[] args) { Array_Generic<int> intArr = new Array_Generic<int>(); Array_Generic<double> dblArr = new Array_Generic<double>(); intArr.GetElement(3); dblArr.GetElement(6); }
그렇다면 일반화는 무조건으로 다 사용할 수 있게 해야할까요?
Where을 통해 설정 할 수 있다고하네요.
where T : struct T는 값 형식 where T: class T는 참조형식 where T: new() T는 매개변수가 없는 생성자 where T : 기반_class_이름 T는 명시한 기반class의 파생class where T : 인터페이스_이름 T는 명시한 Interface를 반드시 구현 where T : U T는 또다른 매개형식, 매개변수 U로부터 상속받은 class여야 한다. 참고해 주시면 되겠습니다.
다음에는 일반화 컬렉션에 대해 알아보겠습니다. :D
'C#' 카테고리의 다른 글
[C#] Delegate에 대한 공부(3) Delegate Chain (0) 2022.04.01 [C#] Delegate에 대한 공부(2) (0) 2022.03.22 [C#] 일반화(3) (0) 2022.03.02 [C#] 일반화(1) (0) 2022.01.14 [C#] Delegate에 대한 공부(1) (0) 2022.01.07