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

 "델파이 프로그래밍 언어"(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 21591
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 20217
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 22272
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 28023
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 29312
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 24636
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 45566
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 181110
63 [다시보기] 전세계 개발자를 위한 컨퍼런스! CodeRage 2018 file 관리자 2018.11.29 354
62 CodeRage XI 온라인 컨퍼런스 안내 file 험프리 2016.11.15 352
61 [베를린] Eddystone 비콘을 사용할 수 있습니다. 관리자 2016.05.30 351
60 [발표자료] 2015년 12월 C++ Skill Sprints 온라인 세미나 시리즈 관리자 2015.12.30 350
59 RAD서버에서 데이터를 JSON으로 어떻게 오픈할 수 있을까요? (JSONValue와 JSONWriter 활용하기) 관리자 2020.01.21 350
58 이 달의 기술자료 - 2019년 09월 file 험프리 2019.08.28 350
57 C++빌더 마이그레이션, C++ 프로젝트를 간편하게 업데이트 하는 방법 관리자 2021.01.19 348
56 윈도우 10 룩앤필을 바로 적용할 수 있는 윈도우 10 VCL 컨트롤 소개 file 험프리 2020.01.15 348
55 최신 C++ 표준으로 최신 윈도우 지원까지 관리자 2019.09.10 348
54 델파이로 개발된 '3D Train Studio'가 BizWireTV의 'Startup Standout' 분야에 선정되었습니다. file 관리자 2017.03.14 345
53 새해 목표: LEARN, TEACH, REPEAT. 관리자 2021.01.05 342
52 C++ 업데이트 소식: 10.4와 10.4.1에서 집중한 C++ 품질과 관련하여 관리자 2020.10.12 340
51 JomiTech – TwineCompile (C++빌더용) 관리자 2020.09.01 340
50 Fire Power X - RAD스튜디오 10.4 버전에 최적화된 파이어몽키용 컴포넌트 스위트 관리자 2020.08.28 339
49 2020년 5월 GM 업데이트 - 여러분의 비즈니스에 길을 열어주세요! 관리자 2020.05.26 337
48 IBLite 라이브러리 및 라이선스 배포하기 관리자 2020.04.08 337
47 데브기어 기술레터 - 2017년 1월 관리자 2016.12.30 337
46 함께 축하해요! 델파이 25주년!! #Delphi25th file 관리자 2020.02.14 336
45 [10.3 리오][업데이트 2] C++17이 윈도우 64-bit에서도 지원됩니다. file 관리자 2019.07.25 335
44 [발표자료] 20171116 델파이/C++빌더 의료 개발 세미나 관리자 2017.11.17 335