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

 "델파이 프로그래밍 언어"(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 14387
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13023
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 15532
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 21064
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 22297
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 17933
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 38228
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 173741
1303 [참고] MAC OSX 에서 ExtractFileName 사용시 주의점. [1] c2design 2012.03.23 7722
1302 [동영상강의] 델파이 기본 교육_5.코드작성3(클래스) 관리자 2012.05.23 7696
1301 2012년 소프트웨어 트랜드 세미나 박병일 2012.01.12 7610
1300 [델파이 문법] 문법 요소 #1 file 관리자 2012.09.17 7578
1299 파이어몽키와 VCL을 한 화면에서 함께 사용할 수 있는 방법을 설명한 동영상 [2] 관리자 2012.05.09 7571
1298 [델파이 문법] 문법 요소 #11 file 관리자 2012.11.12 7565
1297 TMS 파이어몽키용 테이블뷰 컴포넌트 출시 [1] 박병일 2012.02.07 7541
1296 [델파이 문법] 클래스와 객체 #2 [1] file 관리자 2012.04.17 7487
1295 [델파이 문법] 문법 요소 #10 file 관리자 2012.11.08 7434
1294 [동영상강의] 델파이 기본 교육_9.폼띄우기 관리자 2012.06.12 7433
1293 [델파이 문법] 프로그램과 유닛 #3 file 관리자 2012.09.10 7423
1292 [델파이 문법 시리즈] #4. 익명메소드 - 활용법(마지막) file 관리자 2012.04.10 7415
1291 [델파이 문법] 문법 요소 #12 file 관리자 2012.11.15 7409
1290 앤더슨 올슨이 아이폰용 컴포넌트의 새버전을 오픈 했습니다. [3] file 관리자 2012.05.09 7391
1289 [델파이 문법] 클래스와 객체 #6 file 관리자 2012.04.25 7387
1288 델파이 BDE에서 DBExpress로 마이그레이션 하기 기술 문서 file 박병일 2012.03.05 7361
1287 [동영상강의] 델파이 기본 교육_4.유니트구조와 코드작성2(프로시저와함수) 관리자 2012.05.17 7349
1286 [세미나자료] 20120508 "Mac과 윈도우를 동시에… 동일한 소스코드로 멋지게 개발" file 관리자 2012.05.10 7320
1285 델파이 XE2로 만든 아이폰용 Datasnap Client 관리자 2011.12.22 7283
1284 C++ 빌더 로드맵 - C++의 미래 – 64bit, C++11, ARM, iOS, 안드로이드 관리자 2012.05.30 7266