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

 "델파이 프로그래밍 언어"(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 14519
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13149
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 15668
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 21186
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 22438
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 18069
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 38348
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 173856
110 Developer Direct LIVE! 모바일 썸머 스쿨!! 관리자 2013.07.06 2952
109 [기술백서] 모바일로 가면서 개발자가 하게 되는 실수 TOP5 (한글) 관리자 2013.07.06 4315
108 TListView iOS 샘플 제공 관리자 2013.06.28 4023
107 아이폰, 아이패드, 아이팟 앱 개발을 위한 파이어몽키 용 TMS 컴포넌트가 출시되었습니다. 관리자 2013.06.04 3783
106 IOS 앱을 개발하여 App Store에 등록하는 방법 관리자 2013.05.20 5399
105 델파이XE4로 아이폰, 아이패드, 윈32, 윈64, 맥OS X 단일 소스코드 베이스로 2분만에 개발 관리자 2013.05.13 5599
104 Delphi XE4에서 iOS 개발 환경 구축시 유의 할점. c2design 2013.05.11 5381
103 [웹세미나 안내] 델파이를 활용한 멀티-디바이스 앱 개발 관리자 2013.03.29 4634
102 멀티-티어 작업을 더욱 쉽게 만들어주는 Class Helper 관리자 2013.03.26 5000
101 델파이로 간단하게 슬라이드 효과를 적용한 iOS앱 만들기 관리자 2013.03.26 4953
100 [델파이 문법] 데이터 타입, 변수 및 상수 #4 file 관리자 2013.02.19 6367
99 [델파이 문법] 데이터 타입, 변수 및 상수 #3 file 관리자 2013.02.13 6729
98 [델파이 문법] 데이터 타입, 변수 및 상수 #2 file 관리자 2013.02.04 8214
97 [델파이 문법] 데이터 타입, 변수 및 상수 #1 관리자 2012.12.25 6978
96 [델파이 문법] 문법 요소 #15 file 관리자 2012.12.25 5386
95 델파이/C++빌더/RAD Studio XE3 업데이트1 다운로드 및 보완사항 리스트 관리자 2012.12.21 5191
94 [델파이 문법] 문법 요소 #14 file 관리자 2012.12.17 5352
93 [웹 세미나] RAD 따라잡기: 윈도우8 스타일 관리자 2012.11.27 4487
92 CodeRage7 : '델파이' 다시보기 관리자 2012.11.24 5259
91 [델파이 문법] 문법 요소 #13 file 관리자 2012.11.20 6104