3.3 ABAP Run Time Type Services (RTTS)
3.3.1 ABAP RTTS 시스템 클래스
CL_ABAP_TYPEDESCR 은 RTTS의 Root Class이며, 추상 클래스이므로, 인스턴스를 직접적으로 만들 수 없다.
한 줄 요약 : CL_ABAP_TYPEDESCR의 메서드 중 Describe_By_ 로 시작하는 메서드들을 잘 활용하자
3.3.2 Type Objects
DATA : lr_fname_ref TYPE REF TO data,
lo_fname_type TYPE REF TO cl_abap_elemdescr.
FIELD-SYMBOLS : <lfs_fname> TYPE any.
"'?=' widening cast가 필요한 이유
"1.CL_ABAP_TYPEDESCR 은 추상클래스여서, 직접적으로 인스턴스를 만들 수 없기 때문에
"2. Type Handle 은 CL_ABAP_DATADESCR 이하의 Type Object만 지원한다.
lo_fname_type ?= cl_abap_typedescr=>describe_by_name( 'AD_NAMEFIR' ).
"Type Handle 의 정보를 바탕으로 ABAP 런타임 환경은 dynamically하게 data Obj.을 만들어낸다.
CREATE DATA lr_fname_ref TYPE HANDLE lo_fname_type.
"굳이 Casting 안해줘도 되지만 확실함을 위하여 한 번 더 써줌.
ASSIGN lr_fname_ref->* TO <lfs_fname> CASTING TYPE HANDLE lo_fname_type.
<lfs_fname> = 'Anderson'.
WRITE: 'Frist Name Is: ', <lfs_fname>.
한 줄 요약 : Type Handle 은 CL_ABAP_DATADESCR 이하의 Subclass / Type Object만 지원한다.
3.3.3 Custom Data를 Dynamic 하게 정의하기
Describy_by_ 로 시작하는 메서드를 이용해서, 빌트인 참조 타입 및 데이터 오브젝트를 만들 수 있었다.
더 나아가, CL_ABAP_ELEMDESCR 의 메서드 get_c()를 이용해서, 커스텀 엘리먼트 타입을 정의하거나
위의 get_c() 와 함께 CL_ABAP_STRUCTDESCR의 메서드 create()를 이용하여 커스텀 스트럭쳐 타입을 정의할 수 있다.
3.3.4 RTTS 케이스 스터디
모든 ALV의 핵심은 필드카탈로그를 구성하는데에 있다.
CL_SALV_TABLE 메서드 FACTORY( )내에는 Dinamic 인터널 테이블의 데이터들을 담당하는 changing 파라미터인 T_TABLE이 있는데, 이 T_TABLE은 SET_DATA( ) 메서드를 통해 ALV grid와 bind되어진다.
SET_DATA( ) 내부에는 T_TABLE이 저장되는 R_TABLE이 있다.
1. cl_salv_data_descr=>describe_table( )을 통해 R_TABLE 메타데이터들(컴포넌트 정보 등)이 필드심볼을 통해 역참조 되어진다.여기서, 역참조하는 이유는 데이터주소가 아닌 데이터 값에 접근해야 유의미한 작업을 할 수 있기 때문이다.(assign r_table->* to <table>.)
2. 이러한 필드심볼의 line 타입을 기준으로 데이터 오브젝트들이 생성되어진다.
(create data r_data like line of <table>.)
3. cl_abap_structdesc의 describe_by_ 메서드를 통해 인터널 테이블의 한 라인의 속성들이 r_tabdescr로 저장된다.여기서, '?=' widening cast가 필요한 이유는 describe_by_data_ref( )의 리턴 파라미터가 CL_ABAP_TYPEDESCR이라는 추상클래스를 참조하고 있는데, 추상클래스에서 직접적으로 인스턴스를 만들 수 없기 때문이다.(r_tabdescr ?= cl_abap_structdescr=>describe_by_data_ref( r_data ).)
4. cl_salv_data_descr 의 메서드인 read_structdescr( r_tabdescr )을 통해 필드카탈로그를 생성하기 위한 정보들이 r_column이라는 객체 참조 파라미터에 저장된다.
한 줄 요약 : RTTS 라고, 나중에 많이 쓰이는 기술이라고 해서, 나름 분석한다고 해서 여기저기 알아봤는데, 아직까지 뜬 구름 잡는 기분.