728x90
제약 조건의 역할
- 런타임 오류가 발생할 가능성이 있는 부분을 컴파일 타임 오류로 대체한다.
- 타입 매개변수로 사용할 수 있는 타입을 명확히 규정하여 사용자에게 도움을 준다.
제약조건은 타입 매개변수가 무엇을 해서는 안되는지를 정의할 수 없다.
이때, 타입 매개변수로 지정하는 타입이 IDisposable을 구현하고 있다면 추가 작업이 필요하다.
제네릭 메서드 내에서 타입 매개변수로 주어지는 타입을 이용하여 인스턴스를 생성할 경우
public interface IEngine
{
void DoWork();
}
public class EngineDriverOne<T> where T : IEngine, new()
{
public void GetThingsDone()
{
T driver = new T();
using (driver as IDisposable)
driver.Dowork();
}
}
설명
IDisposable로 형변환된 객체를 저장하기 위해 숨겨진 지역변수를 생성한다.
만약 T가 IDisposable을 구현하지 않았다면 이 지역변수의 값은 null이 된다.
타입 매개변수로 주어진 타입을 이용하여 인스턴스를 생성하는 경우, 반드시 using 문을 사용해야 한다.
또한 해당 타입이 IDisposable을 구현했는지 알 수 없으므로 형변환을 해줘야 한다.
C# 컴파일러가 하는 일
- 지역변수 값이 null인지 검사
- Dispose()를 호출하도록 코드 생성
따라서 지역변수의 값이 null인 경우 Dispose()가 호출되지 않는다.
반대로 T가 IDisposable을 구현했다면 using 블록을 종료할 때 Dispose()가 호출된다.
결론
- 제네릭 클래스의 타입 매개변수로 객체를 생성하는 경우, 이 타입이 IDisposable을 구현하고 있는지 확인해야 한다.
- 항상 방어적으로 코드를 작성하고 객체가 삭제될 때 리소스가 누수되지 않도록 주의해야 한다.
- 코드를 수정하여 타입 매개변수 객체를 생성하지 않도록 할 수 있지만, 타입 매개변수로는 지역변수 정도만 생성하는 것이 좋다.
- 타입 매개변수로 멤버 변수를 선언해야 하는 경우 지연 생성을 사용하거나 제네릭 클래스에서 IDisposable을 구현해야 할 수 있다.
반응형
'개발공부 > C#' 카테고리의 다른 글
[Effective C#] 아이템 23 : 타입 매개변수에 대해 메서드 제약 조건을 설정하려면 델리게이트를 활용하라 (0) | 2021.11.29 |
---|---|
[Effective C#] 아이템 22 : 공변성과 반공변성을 지원하라 (0) | 2021.11.28 |
[Effective C#] 아이템 20 : IComparable<T>와 IComparer<T>를 이용하여 객체의 선후 관계를 정의하라 (0) | 2021.11.26 |
[Effective C#] 아이템 19 : 런타임에 타입을 확인하여 최적의 알고리즘을 사용하라 (0) | 2021.11.25 |
[Effective C#] 아이템 18 : 반드시 필요한 제약 조건만 설정하라 (0) | 2021.11.24 |