제네릭의 제약 조건은 크게 두가지 역할을 한다고 볼수 있다.
- 런타임 오류를 컴파일 오류로 발생하도록 바꿔준다.
- 타입매개변수를 규정해 사용자에게 도움을 준다.
이때, 요구작어보이에 그 타입이 어떤 작업을 하는 지 기능이 있는 지, 신경을 쓰지 않지만, IDisposable을 구현할 경우
특별한 작업이 추가적으로 필요하다.
제네릭 메서드 내에서 타입 매개변수로 주어지는 타입을 이용하여 인스턴스를 생성할 경우
-> 타입 매개변수에서 IDisposable을 구현하고 있을 때
만약, 매개변수 타입의 인스턴스를 생성할 때, (T 변수명 = new)일경우 이타입의 메소드를 불러올 때, IDisposable을 체크해주지 않는다면, 리소스 누수가 일어날수있다고 한다. (using 변수명 as IDisposable)로 형변환하여 null체크를 해준다.
null이 아니라면 Dispose()메소드(따로 구현할 필요가 없다.)를 수행한다.
타입 매개 변수로 전달한 타입을 이용하여 멤버 변수를 선언한 경우
-> 안에서 Dispose를 구현 할 때
클래스 내부에서 인스턴스를 생성해주고 (변수선언 필드에서 인스턴스를 만들어준다는), dispose메소드를 내부에서 따로 정의 해주는 방식인경우. 클래스에 sealed를 선언해주면 dispose패턴을 사용할 필요가 없고, dispose()메소드가 여러번 불릴수도 있고, 여러번 불려도 문제없이 돌아가도록 작성해줘야 한다. 하지만, 이경우 코드가 너무 복잡해지므로
DIspose()메소드 호출의 책임을 외부로 넘겨주고 (생성자에서 인스턴스를 생성해주도록 한다? 이렇게 하면, 제네릭 호출시에 타입패러미터를 넘겨줌과 동시에 instance생서을 해주게 되는 데, 이를 뜻하는 것 같다.)
Dispose소유권도 외부로 넘긴다. 이렇게 한다면 new()를 제약 조건에서 뺄수도 있고, 코드도 간결해진다.
타입매개변수 인스턴스 생성하면 IDisposable구현 여부 확인! 아니면 제네릭 안에서 인스턴스 생성 안하도록 구조 변경!
지역변수로서 생성하도록 하자, 웬만하면. 아니면, 타입 매개변수로 멤버 변수를 선언해야 하는 경우라면 지연 생성을 사용해야 할 수도 있고, 제네릭 클래스에서 IDisposable을 구현해야 할 수도 있다..고 한다.
'Programming > C#' 카테고리의 다른 글
c++ -> c#인터프리터 정리 (0) | 2023.07.03 |
---|---|
Effective C# - item 1 ~ 10 (0) | 2022.10.03 |
Effective C# - 제네릭의 활용) 런타임에 타입을 확인하여 최적의 알고리즘을 사용하자. (0) | 2022.09.11 |
Effective C#-제네릭 활용: 필요한 제약 조건만 설정 +) 제네릭? (2) | 2022.09.02 |
Effective C# - 캐스트보다 is, as를 사용하자 (0) | 2022.08.29 |