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

 "델파이 프로그래밍 언어"(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 15417
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13960
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 16496
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 22048
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 23267
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 18921
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 39245
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 174696
623 [추가된 문법 정리] - 클래스 메소드(Class Method):델파이 2007 추가 관리자 2016.06.03 1278
622 [추가된 문법 정리] - 클래스 필드(Class Field):델파이 2007 추가 관리자 2016.06.03 828
621 [발표자료] 20160602 Upgrade VCL! 오래된 프로그램, 최신식으로 탈바꿈하기 관리자 2016.06.02 789
620 [베를린] GetIt 속성값을 별도의 옵션창에서 관리할 수 있습니다. 관리자 2016.05.30 336
619 [베를린] Eddystone 비콘을 사용할 수 있습니다. 관리자 2016.05.30 333
618 [베를린] 윈도우10에서 블루투스LE와 비콘을 활용할 수 있습니다. 관리자 2016.05.30 979
617 이 달의 기술자료 - 2016년 06월 file 험프리 2016.05.27 632
616 [업데이트][핫픽스][10.1 베를린] 갤럭시 S7 Edge(안드로이드 6.0.1) 디버깅이 되지않는 이슈 패치 험프리 2016.05.27 676
615 10.1 베를린 부터는 리본 컨트롤을 겟잇 패키지 매니저에서 설치할 수 있습니다. 험프리 2016.05.27 514
614 코드사이트(CodeSite)로 로그를 기록하며 프로그램의 문제를 파악할 수 있습니다. file 험프리 2016.05.26 2687
613 브레이크 포인트를 설정해도 디버깅이 안되는 경우 살펴볼 항목 file 험프리 2016.05.13 2806
612 [발표자료] 20160504 새로 강화된 기능들: RAD Studio, Delphi, C++Builder 관리자 2016.05.09 486
611 [베를린] TBufferedFileStream을 이용해 TFileStream 보다 더 빠르게 파일을 읽고, 쓸수 있습니다. file 험프리 2016.05.09 3079
610 [필독] Berlin Dialog 사용법 상당부분 변경 및 기능추가 (소스링크추가) [1] c2design 2016.05.04 858
609 [업데이트][핫픽스][10.1 베를린] 데이터스냅(DataSnap) ApplyUpdates 핫픽스 험프리 2016.04.28 870
608 이 달의 기술자료 - 2016년 05월 file 험프리 2016.04.26 658
607 [베를린] 스타일 디자이너에 미리보기, 클립보드 기능등이 강화되어 더욱 사용하기 편리해 졌습니다. file 험프리 2016.04.26 852
606 [베를린] 연락처 컴포넌트(TAddressBook)로 연락처 정보를 읽고 쓸수 있습니다. file 험프리 2016.04.25 620
605 [베를린] ListView 레이아웃을 입맛에 맞게 변경할 수 있습니다. file 험프리 2016.04.22 2124
604 [베를린] FireUI 앱 미리보기 - 개발중인 앱의 디자인을 장치에서 실시간으로 확인하며 개발할 수 있습니다. file 험프리 2016.04.22 1119