[TIL-251226] Generic

데비·2025년 12월 26일

본과정

목록 보기
16/79

오늘 배운 내용

- Generic


object 형식

  • object 형식은 C#의 존재하는 모든 클래스의 기본이 되는 자료형으로, object 형식을 사용하면 데이터의 형식에 관계없이 object 형식의 자료형에 담을 수 있다.
  • 하지만 참조 형식으로만 저장하여 해당 데이터를 Heap에 할당하고, 주소 값만 담고 있다. 때문에 데이터를 다시 활용하기 위해서는 값 형식으로 변환하는 과정이 필요하다.

박싱과 언박싱

- 박싱(Boxing)

  • 값 형식에서 object 형식과 같은 참조 형식으로 변환 하는 과정을 박싱(boxing)이라고 한다.
int a = 5;

// a의 데이터를 복사해 Heap 메모리에 할당 => 박싱
// 암시적으로 발생
objecet b = a;

- 언박싱(UnBoxing)

  • object 형식과 같은 참조 형식에서 값 형식으로 변환 하는 과정을 언박싱(unboxing)이라고 한다.
int a = 5;
object b = a;

// b의 데이터를 복사해 스택 메모리에 할당 => 언박싱
// 명시적으로 선언해야 함
int c = (int)b;

제네릭(Generic)

  • 다양한 데이터 형식을 다룰 수 있는 방식이다.
  • 대상에 맞는 정확한 데이터 형식으로 적용해주는 역할을 한다.
  • object의 박싱/언박싱의 성능저하와 위험성을 보완해서, 박싱/언박싱 단계를 거치지 않고 형식을 조정하므로 성능이 향상되고, 컴파일 단계에서 올바른 데이터 형식이 적용되므로 형식 안정성이 보장된다.
  • object를 사용할때보다 간결하고, 직관적인 코드 작성이 가능하다.
public void Swap(ref int a, ref int b)
{
	int temp = a;
    a = b;
    b = temp;
}
  • 위와 같은 위치 변환 함수를 만들었을 때 정수형(int)이 아닌 실수형(float)으로 함수를 사용하고 싶다하면
public void Swap<T>(ref T a, ref T b)
{
	T temp = a;
    a = b;
    b = temp;
}
  • 이런식으로 제네릭을 사용하면 실수가 오던 정수가 오던 대상에 맞는 정확한 데이터 형식으로 변환 해준다.

- 제네릭 형식 제약 조건(where)

  • 제네릭 형식, 메서드, 대리자 또는 로컬 함수의 형식 매개 변수에 대한 인수로 사용되는 형식에 대한 제약 조건을 지정한다.

  • 제약 조건은 인터페이스, 기본 클래스를 지정하거나 제네릭 형식을 참조, 값 또는 관리되지 않는 형식으로 요구 할 수 있다.

  • 형식 인수에 있어야 하는 기능을 선언하고, 선언된 기본 클래스 또는 구현된 인터페이스 다음에 배치 해야한다.
    출처:MSDN 공식 문서

  • 제네릭 where에서 new()는 매개변수가 없는 생성자가 있어야한다.

0개의 댓글