쌓고 쌓다

[ABAP] RTTS (RunTime Type Service) 본문

SAP/ABAP

[ABAP] RTTS (RunTime Type Service)

승민아 2026. 3. 15. 01:29
반응형

RTTS

RTTS는 RunTime Type Service이다.

프로그램 실행중에 데이터의 타입 정보를 얻거나, 데이터의 타입을 동적으로 생성을 돕는 클래스이다.

 

RTTS로 RTTI와 RTTC가 있다.

 

1. RTTI (RunTime Type Identification) - 타입 정보 얻기

이미 존재하는 데이터를 가지고 타입 정보를 얻는다.

 

2. RTTC (RunTime Type Creation) - 타입 생성

프로그램 실행 도중에 사전에 정의하지 않은 새로운 타입을 생성함.

 

 

그냥 타입 추론과 생성 기능이 있다고 간단하게 생각하자~

 

CL_ABAP_TYPEDESCR 클래스를 사용하는데

위의 구조를 갖는다.

 

예제 코드

 

DESCRIBE_BY_DATA

변수 GT_DATA와 GS_DATA를 사용했을때 차이를 보자.

 

1. GT_DATA 변수

GO_TYPEDESCR 변수에 여러 필드가 존재하지만 CL_ABAP_TYPEDESCR 필드에 값을 보면

타입 종류 KIND에 T가 들어가 있고

T는 KIND_TABLE 테이블 타입임을 알 수 있다.

 

TYPE_KIND도 타입을 표현하는거 같은데

TYPE_KIND와 KIND 두개의 차이를 모르겠다 ㅎㅎ.

 

GO_TYPEDESCR 변수에 담긴 필드를 조금 더 내려보자.

 

CL_ABAP_TABLEDESCR 필드에 값이 담겨있다.

다른 STRUCT나 COMPLEXDESCR 필드도 아닌

CL_ABAP_TABLEDESCR 필드에 값이 들어있다.

 

왜냐. 값의 타입이 T라고 테이블 타입이라고 했으니

정보들이 CL_ABAP_TABLEDESCR 필드에 담겨 있는 것이다.

 

만약 구조체 타입이였다면 CL_ABAP_STRUCTDESCR 필드에 값이 들어 있을 것이다.

 

KEY 필드에는 이 테이블 타입이 어떤 필드를 키 값으로 구성되었는지도 알 수 있다.

 

2. GS_DATA 변수

GS_DATA 변수의 타입은 STRUCTURE 타입이다.

그래서 CL_ABAP_STRUCTDESCR에 값이 들어 있다.

 

이 구조체에 구성된 필드들도 COMPONENTS를 통해 알 수 있다.

 

 

계층 구조

자 이제 처음에 보여준 계층 구조에 대해 정리해보자.

 

GO_TYPEDESCR 변수는 CL_ABAP_TYPEDESCR 타입이다.

 

이 변수에 CL_ABAP_TYPEDESCR, CL_ABAP_TABLEDESCR, …, CL_ABAP_STRUCTDESCR 변수가 존재한다.

 

위의 계층 구조가 포함되어 있는 것이다.

 

우린 이제 테이블 정보냐 구조체 정보냐에 따라 CL_ABAP_TABLEDESCR, CL_ABAPSTRUCTDESC 변수에

담아서 필요한 메소드와 정보들을 사용하면 되는것이다.

 

변수에 담을때 다운캐스팅인지, 업캐스팅인지에 따라 = 또는 ?=를 사용한다.

 

DESCRIBE_BY_NAME

예제 코드에서는 DESCRIBE_BY_DATA로 이미 존재하는 데이터 오브젝트를 가지고 정보들을 뽑아냈다.

 

하지만 DESCRIBE_BY_NAME을 사용하면

로컬로 선언된 타입이나, DDIC에 선언된 STRUCTURE로 타입 정보들을 뽑아낼 수 있다.

 

다음 사진들은

DESCRIBE_BY_NAME( ‘TY_TYPE’ ).으로 호출했을때의 결과이다.

 

로컬로 선언한 'TY_TYPE' 타입은 구조체 타입임을 확인할 수 있다.

구조체 타입이므로 CL_ABAP_STRUCTDESC 필드에 정보가 담겨져 있다.

 

 

DDIC에 정의된 Deep Structure 타입도 다음과 같이 읽을 수 있다.

 

계층 구조를 이용해서 자유자재로 타입 변환을 해가며

타입 정보들을 얻을 수 있다.

 

입력 받은 DDIC Structure 이름으로 Internal Table 만들어보기

 

<GT_TABLE>에는 입력 받은 테이블명으로 Internal Table을 구성할 수 있다.

 

COMPONENTS로 구조체를 만들 수 있고

이 구조체로 또 TABLE 타입을 만들 수 있다.

이 TABLE 타입으로 동적 Internal Table을 만들 수 있다.

 

응용 - 필드 추가하고 삭제하기

응용해서 컴포넌트를가지고 Internal Table을 만드는 코드 중간에

컴포넌트들을 추가하건 삭제해서 Internal Table을 새롭게 구성할 수도 있다.

 

예를 들어 셀 색깔을 위한 'LVC_T_SCOL' 타입의 필드를 추가한다면

위와 같이 DDIC에 존재하는 'LVC_T_SCOL'이므로

DESCRIBE_BY_NAME을 통해서 추가할 수 있다.

 

 

값은 다음과 같이 접근해서 넣었다.

 

 

 

필드 카탈로그 만들기

테이블명을 한개 입력 받았을때

동적 Internal Table을 구성하고 필드 카탈로그를 만드는 로직이다.

복잡한 구조는 아니고 단 하나의 테이블일때만 이렇게 만들어봤는데

 

방법 1

 

 

방법 2

COMPONENTS들로 STRUCTURE를 만들었다면

그 구조를 READ_STRUCTDESC에 넘겨 필드 카탈로그를 뽑아낼 수 있다.

 

GO_STRUCTDESCR에 'LVC_T_SCOL'가 포함되어있지만

알아서 제외해준다.

 

 

셀 스타일 LVC_T_STYL

마찬가지로 LVC_T_STYL 컴포넌트를 끼워 넣고

동적 Internal Table을 생성하면 된다.

 

값 설정은 위와 같이 했다.

 

 

 

 

 

 

 

 

 

반응형