본 내용은 "델파이 프로그래밍 언어" 도서의 일부분을 정리한 것입니다. 보다 자세한 내용은 해당 도서를 통해 확인할 수 있습니다.

 "델파이 프로그래밍 언어"(342쪽, 구입안내): http://tech.devgear.co.kr/devgearbook/2431 


 그 외 데브기어 도서들은 다음 링크를 통해서 확인할 수 있습니다: www.devgear.co.kr/book


제네릭의 제약조건


제네릭의 타입 파라미터에 제약조건을 연계시킬 수 있습니다. 제약조건(constraint)은 제 네릭 타입의 구축(construction) 시에 파라미터로 넘겨질 모든 구체적 타입들이 지원해야 하는 아이템들을 선언합니다.


제네릭에서 제약조건의 지정

제약조건 항목들은 다음과 같은 것들을 포함합니다.


  • 없거나, 하나 이상의 인터페이스 타입
  • 없거나 하나의 클래스 타입 
  • 예약어“constructor”,“class”, 혹은“record”


제약조건으로서“constructor”와“class”를 모두 지정할 수 있습니다. 하지만“record”는 다른 예약어들과 같이 쓰일 수 없습니다. 여러 제약조건을 함께 사용하면 덧셈 합으로 동작 합니다(AND 로직).

여기서 예제들에서는 클래스 타입들만을 보여주지만, 제약조건은 모든 제네릭 형태에 적용 됩니다.


■ 제약조건의 선언

제약조건은 일반적인 파라미터 리스트 내의 타입 선언과 비슷한 방식으로 선언됩니다.


generic_6_1.png


제약조건이 지정된 타입 파라미터를“자유로운”타입 파라미터와 혼합하여 사용할 수 있습 니다. 다음의 모든 코드는 적합합니다.

generic_6_2.png


제약조건의 종류


■ 인터페이스 타입 제약조건


타입 파라미터 제약조건은 0개, 하나 혹은 콤마로 구분된 복수의 인터페이스 타입들의 리스 트를 포함할 수 있습니다.

인터페이스 타입으로 타입 파라미터 제약조건을 지정하는 것은, 컴파일러가 컴파일 중에 타 입 구축(construction)에서 인자로 넘겨진 구체적 타입이 지정한 인터페이스 타입을 구현 하는지 검사한다는 의미입니다.


예를 들면 다음과 같습니다.

generic_6_3.png

generic_6_4.png


■ 클래스 타입 제약조건

타입 파라미터는 0개 혹은 하나의 클래스 타입의 제약조건을 가질 수 있습니다. 인터페이스 타입 제약조건에서와 마찬가지로, 이 선언은 컴파일러가 컴파일 중에 타입 구축 (construction)에서 인자로 넘겨진 구체적 타입이 지정한 제약조건 클래스와 대입 호환되 는지 검사한다는 의미입니다. 클래스 타입들의 호환성은 일반적인 OOP 타입 호환성의 규 칙을 따릅니다. 조상 타입이 필요한 곳에 자손 타입을 넘길 수 있습니다.


■ 생성자 제약조건

타입 파라미터는 0개 혹은 하나의 예약어“constructor”제약조건을 가질 수 있습니다. 이 것은 실제 인자 타입이 기본 생성자(파라미터가 없는 public 생성자)를 정의한 클래스여야 한다는 것을 의미하며, 따라서 인자 타입 자체에 대해 아무것도 모르더라도(최소한의 기반 타입 요구사항도 필요하지 않음) 제네릭 타입 내의 메소드가 인자 타입의 기본 생성자를 사 용하여 인자 타입의 인스턴스를 구축할 수 있게 됩니다.

제약조건 선언에서는“constructor”를 인터페이스나 클래스 타입 제약조건과 어떤 순서로 든 섞어 사용할 수 있습니다.


■ 클래스 제약조건

타입 파라미터 리스트는 0개 혹은 하나의 예약어“class”제약조건을 가질 수 있습니다. 이 것은 실제 타입이 참조 타입, 즉 클래스나 인터페이스 타입이어야 한다는 것을 의미합니다.


■ 레코드 제약조건

타입 파라미터는 0개 혹은 하나의 예약어“record”제약조건을 가질 수 있습니다. 이것은 실제 타입이 값 타입(참조 타입은 불가)이어야 한다는 것을 의미합니다.“record”제약조건 은“class”나“constructor”제약조건과 같이 쓰일 수 없습니다.


■ 타입 추정

제약조건을 가진 타입 파라미터의 필드나 변수를 사용할 때는 그 필드나 변수를 제약조건을 가진 타입들 중 하나로 타입 캐스트할 필요가 없는 경우가 많습니다. 컴파일러는 해당 타입 에 대한 모든 제약조건들에 걸쳐 메소드 이름을 살펴보거나 같은 이름을 가진 여러 메소드 들에 대해 오버로드 해석을 변화시켜봄으로써 코드에서 참조하는 것이 어떤 타입인지 추정 할 수 있습니다.

예를 들면 다음과 같습니다.


generic_6_5.png


FData가 T 타입이고, 이 T 타입은 두 인터페이스 모두 지원하는 것으로 보장되므로, 컴파 일러는 ISerializable 및 ICloneable에서“Clone”메소드를 찾아봅니다. 두 인터페이스가 모두 동일한 파라미터 리스트를 가진“Clone”을 구현할 경우, 컴파일러는“모호한 메소드 호출 에러(ambiguous method call error)”를 내며, 모호함을 없애기 위해 두 인터페이스 중 하나로 타입 캐스트할 것을 요구합니다.



번호 제목 글쓴이 날짜 조회 수
공지 [DelphiCon 요약] 코드사이트 로깅 실전 활용 기법 (Real-world CodeSite Logging Techniques) 관리자 2021.01.19 22591
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 21024
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 23082
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 28881
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 30050
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 25397
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 46348
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 182322
1397 N 윈도우와 맥 개발 시작을 위한 파이어몽키 코스북: 무료 다운로드 제공(385페이지) 관리자 2013.04.05 152367
1396 ComPort(시리얼 통신) 컴포넌트 설치안내 [11] file 험프리 2013.12.04 112782
1395 [REST API] REST 기반 파일 업로드와 다운로드 구현하기 험프리 2020.08.31 84739
1394 델파이 튜토리얼 자습서 이용 안내 관리자 2014.09.01 71988
1393 이 달의 기술자료 - 2014년 11월 험프리 2014.10.13 54176
1392 이 달의 기술자료 - 2014년 6월 file 험프리 2014.06.05 50406
1391 Find the O/S Language Type c2design 2014.07.30 48422
1390 RAD Studio Resource Center 박병일 2012.01.26 46645
1389 CD-ROM 열고 닫기 박병일 2011.12.22 44787
1388 [Android] 폰번호 가져오기 [1] 타락천사 2014.09.05 38644
1387 이 달의 기술자료 - 2014년 12월 file 험프리 2014.11.26 32514
1386 RAD Studio XE6 Update1 발표 [1] Humphery 2014.06.20 29499
1385 델파이XE2 파이어몽키 기반 아이폰앱 개발에서 제스춰를 인식시키는 방법 박병일 2012.01.25 23342
1384 [10.4 시드니 신기능] 새로운 VCL TEdgeBrowser 컴포넌트 험프리 2020.05.18 23197