C#

C#문법-17 : 제네릭

알통몬_ 2019. 5. 24. 12:27
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


오랜만에 포스팅합니다.


지난 포스팅에서는 C# 속성과 static 클래스, 메소드, 필드, 속성에 대해 공부했습니다.

2019/04/25 - [C#] - C#문법-16 : 속성과 static 클래스, 메소드, 필드, 속성


이번 포스팅에서는 제네릭에 대해 공부합니다.


보통 클래스를 정의할 때 클래스 내의 모든 데이터의 타입을 지정해줍니다.

때로는 클래스의 거의 모든 부분이 동일한데 일부 데이터의 타입만 다른 경우가

있을 수 있습니다. 예를 들어서 입력받은 값의 2배를 반환하는 클래스가 있을 때

이 클래스에 int 타입의 필드들만 존재한다면, double 타입의 값들은 입력할 수가

없게 됩니다.

이런 경우에 제네릭 타입을 사용하면 int 뿐 아니라 double, float 등 다양한

실수 타입까지도 사용할 수 있습니다.


제네릭 타입은 특정 타입을 지정하지 않고 데이터 타입을 타입 파라미터로

받아들이도록 클래스를 정의합니다.

자바의 제네릭과 동일합니다.

using System;

namespace workspace_csharp
{

class GenericEx<T>{

T input;
public void setInput(T input) {
this.input = input;
}

public T getInput() {
return input;
}
}
}

특정 타입이아닌 예제처럼 클래스 이름 옆에 <임의의 대문자> 를 넣어줍니다.

여기서는 타입 파라미터의 첫 알파벳인 T를 사용했지만,

사용하기에 따라 원하는 알파벳을 사용하면 됩니다.

제네릭 클래스의 사용

using System;
using System.Text;

namespace workspace_csharp {

public class Program {

public static void Main(String[] args) {
GenericEx<int> geInt = new GenericEx<int>();
GenericEx<string> geString = new GenericEx<string>();

geInt.setInput(100);
int value1 = geInt.getInput();
System.Console.WriteLine(value1);

geString.setInput("100");
string value2 = geString.getInput();
System.Console.WriteLine(value2);
}
}
}

 

또한 .Net Framework에 많은 제네릭 클래스들이 있습니다.

특별히 System.Collections.Generic 네임스페이스에 있는 모든 자료구조와 관련된

클래스들은 제네릭타입입니다.

우리가 잘 아는 것에는 List<T>, Dictionary<T>, LinkedList<T>등의 클래스들이

있습니다.


제네릭 타입제약

제네릭을 선언할 때 타입 파라미터가 Value 타입인지 Reference 타입인지 아니면

특정 부모클래스를 상속받은 클래스인지 등등을 지정할 수 있습니다.

[where : 제약조건] 으로 where  뒤에 붙일 제약조건을 선언하면 됩니다.


ex)

// T는 Value 타입
class MyClass<T> where T : struct{}

// T는 Reference 타입
class MyClass<T> where T : class

// T는 기본 생성자를 가져야 합니다.
class MyClass<T> where T : new()

// T는 ParentClass의 자식 클래스여야합니다.
class MyClass<T> where T : ParentClass

// T는 IComparable 인터페이스
class MyClass<T> where T : IComparable


class EmployeeList<T> where T : Employee,
IEmployee, IComparable<T>, new()
{
}

// 복수 타입 파라미터 제약
class MyClass<T, U>
where T : class
where U : struct
{
}


이상입니다.

다음에는 인터페이스에 대해 공부합니다.

 


반응형