Delphi [델파이 문법 시리즈] #1. 제네릭 - 개요
2012.03.21 19:50
본 내용은 "델파이 프로그래밍 언어" 도서의 일부분을 정리한 것입니다. 보다 자세한 내용은 해당 도서를 통해 확인할 수 있습니다. "델파이 프로그래밍 언어" 자세히 보기: http://tech.devgear.co.kr/devgearbook/2431 |
제네릭, 혹은 제네릭 타입이라는 용어들은 타입으로 파라미터화될 수 있는 기반 내의 것들 의 집합을 설명합니다. 제네릭이라고 말했을 때 제네릭 타입과 제네릭 메소드(제네릭 프로 시저와 제네릭 함수)를 의미하기도 합니다.
제네릭은 알고리즘(프로시저나 함수 등)이나 데이터 구조(클래스, 인터페이스, 레코드 등) 를 그 알고리즘 혹은 데이터 구조가 사용하는 하나 이상의 구체적인 타입으로부터 관계를 끊는 것을 허용하는 추상화 방법들의 집합입니다.
그 정의에서 다른 타입들을 사용하는 메소드나 데이터 타입은 하나 이상의 구체적 타입을 타입 파라미터로 대체시킴으로써 더 일반화시킬 수 있습니다. 그런 후 그런 타입 파라미터 를 메소드나 데이터 구조 선언의 타입 파라미터 리스트에 추가하면 됩니다.
이것은, 바디에 있는 문자 상수의 인스턴스를 파라미터 이름으로 대체시키고 그 파라미터를 프로시저의 파 라미터 리스트에 추가하여 프로시저를 더 일반화시킬 수 있는 것과 비슷합니다.
예를 들어, 객체들(TObject 타입)의 리스트를 유지하는 클래스(TMyList)를, TObject를타입 파라미터 이름‘( T’같은)으로 대체하고 타입 파라미터를 클래스의 타입 파라미터 리 스트에 추가하여 TMyList<T>으로 하면, 재사용성이 높고 타입에 안전하도록 만들 수 있습 니다.
제네릭 타입이나 메소드를 구체화(인스턴스화)하려면 사용하려는 시점에 제네릭 타입이나 메소드에 타입 인자를 지정하면 됩니다. 타입 인자를 지정하는 동작은 제네릭 정의 내의 타 입 파라미터들을 해당 타입 인자로 대체함으로써 새로운 타입이나 메소드를 실질적으로 생 성하게 됩니다.
예를 들면, 위의 리스트는 TMyList<Double>와 같이 사용될 수 있습니다. 이 코드는 TMyList<Double> 이라는 새로운 타입을 생성하며, 그 정의는 모든‘T’가‘Double’로 대 체되었다는 점 외에는 TMyList<T>와 동일합니다.
서로 다른 특징들이 있기는 하지만, 추상화(abstraction) 메커니즘으로서의 제네릭은 다형 성(polymorphism)의 기능들과 많은 부분에서 중복된다는 점을 언급할 필요가 있습니다. 인스턴스화 시점에서 새로운 타입이나 메소드가 만들어지기 때문에 타입 에러를 더 빨리(실 행 중이 아닌 컴파일 중에) 찾아낼 수 있습니다.
이런 특징은 또한 최적화의 범위를 넓혀준 다는 장점도 있지만, 다른 한편으로는 각각의 인스턴스화마다 최종 실행되는 애플리케이션 의 메모리를 사용하기 때문에 성능을 낮출 가능성도 있습니다.
코드 예제
다음의 예에서, TSIPair는 String과 Integer의 두 데이터 타입을 저장하는 클래스입니다.
클래스를 데이터 타입과 독립적으로 만들려면, 데이터 타입을 타입 파라미터로 대체합니다.