Creative Commons License

Microsoft .NET

닷넷!시작하기
닷넷! Ver 2.0~
닷넷!스킬업
웹개발
윈폼개발
실용모듈개발
Tip & Tech
하루 한 문법

Microsoft .NET 개발자들을 위한 공간입니다. 기초강의에서 부터 고급 기술 정보 및 팁등을 다루도록 하겠습니다.

.

닷넷! Ver 2.0~

.NET은 순식간(?)에 버전업 되었습니다. 이는 신기술의 탄생도 동반했습니다 .NET 2.0 , .NET 3.0, .NET 3.5 등 새로운 기능 및 확장된 기능에 대해 다룹니다

[Generics] Generics 제약 조건

작성자 : 박종명
최초 작성일 : 2008-05-13 (화요일)
최종 수정일 : 2008-05-13 (화요일)
조회 수 : 3104

* Generics 제약 조건

실행시 타입이 결정되는 Generics 기법을 이용하다 보면 그 타입이 반드시 지켜야 하는

조건을 주어야 하는 경우가 있다.

 

아래의 경우를 살펴 보자.

 

public class MyUnit<T>

{

        public T unit;

        public void Attack()

        {

unit.Attack();

        }       

}

 

T 타입인 unit 변수의 Attack 메서드를 호출하려고 한다.

당연히 컴파일 시 오류가 나겠지만 이런 식으로 전달되는 타입이 특정한 조건을 반드시

만족해야 하는 경우가 발생할 수 있다.

 

아래는 Generics 의 제약조건과 키워드를 설명한다.

a.      타입 매개 변수는 Value Type 이어야 한다 ? where : struct

b.      타입 매개 변수는 Reference Type 이어야 한다 ? where : class

c.      전달되는 타입은 기본 생성자를 가지고 있어야 한다 ? where : new()

d.      전달되는 타입은 class 명으로부터 상속받아야 한다 ? where : class

e.      전달되는 타입은 interface 명을 구현하여야 한다 ? where : interface

 

그러면 위의 MyUnit 클래스를 보면 T 타입으로 전달되는 데이터 타입은

Attack 메서드를 가지고 있어야 한다라고 제약조건을 줄수가 있다.

 

아래 예제에서는 IUnit 라는 인터페이스를 정의하고 구현해야 하는 메서드를 Attack 로 정의했다.

그리고 MyUnit 를 정의할 때 where T : IUnit 라고 명시함으로써 IUnit 인터페이스를 구현하는

질럿과 드래군 개체만이 MyUnit 의 지네릭 타입으로 결정될수 있다.

결과적으로 T 타입의 변수에 Attack() 메서드를 호출할 수 있게 되는 것이다.

 

class Program

{

        static void Main(string[] args)

        {

            MyUnit<IUnit> myUnit1 = new MyUnit<IUnit>();

            MyUnit<IUnit> myUnit2 = new MyUnit<IUnit>();

 

            myUnit1.unit = new Dragon();

            myUnit2.unit = new Zelot();

 

            myUnit1.Attack();

            myUnit2.Attack();                                  

        }       

}

   

public class MyUnit<T> where T : IUnit

{

        public T unit;

        public void Attack()

        {

         //타입 매개변수 T 는 반드시 IUnit 인터페이스를 구현하고 있어야 한다는 조건을 줌으로써

         //T 타입의 unit 변수의 Attack 를 호출할수 있게 된다.

            unit.Attack();

        }       

}

public interface IUnit

{

    void Attack();      

}

public class Dragon : IUnit

{

        public void Attack()

        {

            Console.WriteLine("광선 발사");

        }

}

public class Zelot : IUnit

{

        public void Attack()

        {

            Console.WriteLine("사시미 쑤시기");

        }

}


- 결과

이름
비밀번호
홈페이지
QR <- 왼쪽의 문자를 오른쪽 박스에 똑같이 입력해 주세요