본문 바로가기
[ Program ]/c#스터디

43. 제네릭

by 관이119 2021. 10. 9.

제네릭은 한마디로 이야기하면 배열을 어떤형식으로 사용할지 미리 정해주는것이다.

프로그램에서 형변환은 자원을 많이 먹는 작업이다.

예를 들면 int > object > int 로 형변환을 차례로 한다고 치면 상당히 쓸모없는작업이 많아진다.

이전에 잠시 설명했지만 arrayList 에 인자를 추가하면 어떤값이든 object 로 변환해서 들어가진다.

그상태에서 사용할때는 해당형식으로 또 변환을 해줘야한다.

특별한 근거없이 생각해봐도 아무 쓸모없는행동이 많아진다.

 

가장기본적인 형식중 하나인 List 예제를 보자.

List<타입> 변수 = new List<타입>();

위와같이 지정하고 쓰기만 하면된다.

타입에는 내가 해당 List 에서 사용할 실제 타입을 넣어주면 된다.

예를들면 int , string, 개인이 만든클래스 , 컨트롤 등이 있겠다.

collections , 즉 배열이기때문에 추가하고 삭제하고 반복문으로 내용을 확인하거나 하는 작업을 할수 있다.

 

https://docs.microsoft.com/ko-kr/dotnet/api/system.collections.generic?view=net-5.0 

 

System.Collections.Generic 네임스페이스

제네릭 컬렉션을 정의하는 클래스와 인터페이스가 포함되어 있습니다. 이를 통해 사용자는 제네릭이 아닌 강력한 형식의 컬렉션보다 형식 안전성과 성능이 높은 강력한 형식의 컬렉션을 만들

docs.microsoft.com

 

위 경로를 읽어보면 클래스,구조체, 인터페이스로 나눠져있는데 보통은 클래스만 사용한다.

그리고 자주사용하는것은 

Dictionary<TKey,TValue>
List<T>
Queue<T>

위3가지 정도가 되겠다.

 

구조체의 경우 다음경로에서 읽어보면 이거쓰지말고 클래스 쓰라고 되있다.

간단하게 보면 List<T>.GetEnumerator() 으로 구조체를 가지고 올수는 있지만 이거 쓸거면 클래스로 foreach 해서 써라 라고 적어놨다.

https://docs.microsoft.com/ko-kr/dotnet/api/system.collections.generic.list-1.enumerator?view=net-5.0 

 

List.Enumerator 구조체 (System.Collections.Generic)

List의 요소를 열거합니다.Enumerates the elements of a List.

docs.microsoft.com

 

쉽게 전체적으로 정리하면 내가 사용할때는 

 

List<int> list = new List<int>();

처럼 그냥 클래스 정의하듯이 정의해서 사용하면 되고, 

 

내가 만들때는

class Myclass<T>
{
        T _myvalue;
        public Myclass() //일반 생성자
        {
        }
        public Myclass(T myval) //생성자에서 값을받을때
        {
            _myvalue = myval;
        }

        public string resultstr(T inputval) //파라미터로 사용하는 예제
        {
            return $"result : {inputval.ToString()}";
        }
}

처럼 클래스명에 <T> 를 붙여서 만들어주면 된다.

 

갑작스럽게 나온 T 가 뭔지 당황스러울수 있는데 변수타입이 라고 생각하면 된다. 

T 대신 원하는 문자를 아무거나 넣어주면 되는데 타입이 들어와야 하기때문에 T 라고 일반적으로 사용한다.

 

좀 헷갈릴수 있으니 그림1을 보자.

그림1

 

그림1은 int 형식만 넣을수있는 가변배열을 만들고 그 배열에 10을 넣은것이다.

저기서 List 를 우클릭해서 정의로 이동을 눌러보자.

그림2

 

그림2를 보면 List 라는 클래스에 어떤타입이든 들어갈수 있게 <T> 라고 써준 클래스이다.

위에서 예제로 이야기한 

class Myclass<T>

{

}

도 List 와 같다. 

내가 만들려면 저런형태로 써주면 된다.

 

그리고 아래처럼 특정형식만 받을수 있게 제약을 걸 수도 있다.

그림3

 

그림3에 보면 Myclass 라는 제네릭클래스를 만들었는데 testclass1 형식타입만 가능하게 해놨다.

Myclass<testclass1> : 정의가능

Myclass<testclass2> : 정의불가능

Myclass<testclass3> : 정의가능

위처럼 1,3 은 정의할수 있고 2는 정의할수 없다.

3은 1을 상속받아서 가능한 내용인데 자세한 내용은 아래 경로를 한번 읽어보자.

 

https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters

 

형식 매개 변수에 대한 제약 조건 - C# 프로그래밍 가이드

형식 매개 변수에 대한 제약 조건을 알아봅니다. 제약 조건은 형식 인수에 포함되어야 하는 기능을 컴파일러에 알립니다.

docs.microsoft.com

 

특별히 어려운내용은 없고 형식만 찾아보고 사용하고 하면되는내용이라 별다른 설명도 할만한게 없다.

가장 많이 사용되는 List, Dictionary, Queue 등은 충분히 연습해보자.

 

***숙제 : 100까지의 숫자중 2의배수 , 3의 배수, 5의배수 , 3가지에 속하지않는 숫자  총 4개의 list를 만들고 해당 list 들을 하나의 Dictionary 에 담아보자.

'[ Program ] > c#스터디' 카테고리의 다른 글

45. 파일읽기/쓰기  (0) 2021.10.09
44. 로또생성기만들기  (0) 2021.10.09
42. 상속  (0) 2021.10.09
41.arraylist / List / StringBuilder / 참조추가법  (0) 2021.10.09
40.using/garbage collection  (0) 2021.10.09

댓글