티스토리 뷰
제약이 붙은 제네릭 클래스
어떠한 형태로도 받아 들이는 제네릭은 강력하다. 이러한 제네릭의 <T> 는 대부분의 클래스가 될 수 있다.
그 강력함을 제약해 사용하기 쉽게 하는 수단이 있다. 구체적으로는, 형 파라메터에 제약 리스트를 붙일 수 있다는 것이다. 제약 리스트에는, 클래스나 인터페이스, 생성자의 제약을 지정할 수 있다.
이용 빈도는 낮다고 생각되기 때문에 자세한 설명을 하지 않는다.
아래의 샘플을 보자. 리스트12는 인터페이스 제약, 생성자 제약을 붙였다.
using System;
// IDisposable 인터페이스를실장한다Sample 클래스
public class Sample : IDisposable
{
public void Dispose()
{
Console.WriteLine("Disposed");
}
}
// 제약이붙었다MyClass<T> 클래스
public class MyClass<T> where T : IDisposable, new()
{
public T Value = new T();
public void Close()
{
Value.Dispose();
}
}
class Program
{
static void Main(string[] args)
{
MyClass<Sample> sample = new MyClass<Sample>();
sample.Close(); // 출력:Disposed
}
} |
리스트12 제약이 붙은 제네릭 클래스의 예 |
여기에 제약을 붙이고 있는 것은,
where T : IDisposable, new()
부분이다. Where 는 클래스의 제약을 나타내고, T 에 대한 제약을 의미한다. 그 이후 쓰여진 인터페이스명의 IDisposable 은 형 파라메터 T 에 IDisposable 인터페이스를 구현한 형태에만 지정할 수 있다. 추가로 콤마로 구분하여 new() 는 형 파라메터에 T의 형에 인수가 없는 생성자로 제약한다.
이 제약은, 단지 사용법에 제한을 두는 것은 아니다.
MyClass<T> 클래스 내에서,
Value.Dispose();
처럼 사용한다.(IDisposable 인터페이스의) Dispose 메서드를 호출할 수 있는 것은, 반드시 IDisposable 인터페이스를 구현해야 한다고 하는 제약이 있기 때문이다. IDisposable 인터페이스의 제약이 없으면, T 에 Dispose 메서드가 존재하는지 아닌지는 예측 불가능하고, 컴파일 에러가 된다.
또,
public T Value = new T();
를 사용할 수 있는 것은, 생성자 제약에 의해 T 에는 인수가 없는 생성자가 존재하면 사용할 수 있도록 제약했기 때문이다. 만약 그러한 제약이 없으면 T 에 인수가 없는 생성자가 있는지 아닌지는 예측하지 못하고, 컴파일 에러가 난다.
'.NET > C#' 카테고리의 다른 글
확장 메서드( Extension Method ) (0) | 2007.08.29 |
---|---|
SoundPlayer 클래스로 WAVE 파일 재생 (0) | 2007.08.12 |
[제네릭 3편] Hashtable 클래스와 Dictionary 클래스의 비호환성 (0) | 2007.07.02 |
[제네릭 2편] 제네릭 컬렉션의 사용법 2007-07-01 (0) | 2007.07.01 |
[제네릭 1편] 제네릭이란 무엇인가? 새로운 컬렉션의 소개 (0) | 2007.06.30 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- 2,841,738
- Today
- 3
- Yesterday
- 47
링크
- ***** MY SOCIAL *****
- [SOCIAL] 페이스북
- [SOCIAL] 팀 블로그 트위터
- .
- ***** MY OPEN SOURCE *****
- [GITHUB] POWERUMC
- .
- ***** MY PUBLISH *****
- [MSDN] e-Book 백서
- .
- ***** MY TOOLS *****
- [VSX] VSGesture for VS2005,200…
- [VSX] VSGesture for VS2010,201…
- [VSX] Comment Helper for VS200…
- [VSX] VSExplorer for VS2005,20…
- [VSX] VSCmd for VS2005,2008
- .
- ***** MY FAVORITES *****
- MSDN 포럼
- MSDN 라이브러리
- Mono Project
- STEN
- 일본 ATMARKIT
- C++ 빌더 포럼
- .
TAG
- Visual Studio
- Team Foundation Server 2010
- c#
- TFS
- Visual Studio 2008
- Silverlight
- umc
- ASP.NET
- LINQ
- .NET
- Visual Studio 11
- monodevelop
- .NET Framework 4.0
- Managed Extensibility Framework
- MEF
- 팀 파운데이션 서버
- Windows 8
- test
- Visual Studio 2010
- 비주얼 스튜디오 2010
- 땡초
- Team Foundation Server
- POWERUMC
- TFS 2010
- testing
- mono
- ALM
- 엄준일
- github
- 비주얼 스튜디오
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 |
글 보관함
- 2020/05 (1)
- 2019/10 (3)
- 2018/11 (1)
- 2018/08 (2)
- 2017/04 (1)
- 2017/01 (2)
- 2016/11 (2)
- 2016/08 (1)
- 2016/05 (1)
- 2016/04 (2)
- 2016/02 (2)
- 2016/01 (1)
- 2015/05 (1)
- 2015/04 (2)
- 2015/03 (1)
- 2015/02 (1)
- 2015/01 (1)
- 2014/11 (1)
- 2014/09 (2)
- 2014/08 (2)
- 2014/05 (2)
- 2014/04 (3)
- 2014/03 (2)
- 2014/02 (2)
- 2014/01 (4)
- 2013/12 (2)
- 2013/11 (1)
- 2013/10 (2)
- 2013/09 (6)
- 2013/08 (3)