ABAP
ABAP 데이터 타입
#SAP#DATA TYPE
2025년 2월 27일
ABAP에서 데이터를 다루려면 데이터 타입과 변수 개념을 명확히 이해해야 합니다. ABAP 데이터 타입의 종류와 선언 방법에 대해서 다루어보겠습니다.
What's Inside
0. 개념과 분류
0.1. 개념
- Data Type (데이터 타입) Data Variable의 타입을 정의하는 개념적인 요소
- Data Variable (변수) Data Type을 참고하여 선언된 실제 변수
- Data Object
ABAP 프로그램이 실행되는 동안 메모리를 점유하는 물리적인 단위
즉, Data Variable = Data Object (선언된 변수는 실행 시 데이터 객체가 됨)
0.2. 데이터 타입과 변수 선언 방식
ABAP에서 데이터를 저장하려면 적절한 데이터 타입을 선택하여 변수를 선언해야 합니다.
ABAP의 데이터 타입은 크게 세 가지로 나뉘며, 각 방식에 따라 변수를 선언할 수 있습니다.
-
Predefined ABAP Type
SAP에서 기본 제공하는 타입 → 별도의 정의 없이 사용 가능
-
Local Data Type
프로그램 내에서 정의한 커스텀 타입 →
TYPES문으로 선언 -
Global Data Type
SAP Dictionary(DDIC)에서 정의한 타입 → 여러 프로그램에서 공통 사용 가능
이제 각 데이터 타입의 특징과 선언 방법을 자세히 살펴보겠습니다.
1. Predefined ABAP Type
SAP에서 미리 정의해 둔 데이터 타입으로, 별도의 선언 없이 바로 사용 가능합니다.
이 타입들은 SAP 시스템에서 최적화되어 있으며, 정수, 실수, 문자, 날짜, 시간 등 다양한 데이터 처리를 지원합니다.
1.1. 완전한 데이터 타입
완전한 데이터 (Fully Specified Data) : 데이터 유형의 상세 정보(길이, 소수점 자릿수 등)가 모두 명시된 상태
| 데이터 유형 | 설명 | 초깃값 | 길이 |
|---|---|---|---|
| Numberic Types | - | - | - |
| I (Integer) / INT8 | 정수 | 0 | I : 4 (-2,147,483,648 ~ 2,147,483,647) INT8 : 8 (-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807) |
| F (Floating Point Number) | 부동 소수점 (근사 연산, 정확도 낮음) | 0.0000000000000000E+00 (= 0) | 8 |
| DECFLOAT16 / DECFLOAT34 | 소수점 자릿수가 고정된 10진 부동 소수점 숫자 | 0 | DECFLOAT16 : 16 DECFLOAT34 : 34 |
| Character Types | - | - | - |
| D (Date Field) | 날짜 (YYYYMMDD) | 00000000 | 8 |
| T (Time) | 시간 (HHMMSS) | 000000 | 6 |
| STRING | 가변 길이 문자열 | 없음 | 시스템이 자동 조정 |
| XSTRING | 가변 길이 바이너리 (이미지, 비디오 파일 같은 멀티미디어 데이터) | 없음 | 시스템이 자동 조정 |
| UTCLONG | UTC 타임스탬프 (정확한 타임존 정보 포함) | 없음 | 16 |
| SCREEN | SAP 화면 번호 | 없음 | 4 |
1.2. 불완전한 데이터 타입
불완전한 데이터 (Incomplete Data) : 데이터 유형의 일부 정보만 포함되어 있으며, 길이를 지정해야 하는 경우
| 데이터 유형 | 설명 | 초깃값 | 길이 |
|---|---|---|---|
| Numeric Types | - | - | - |
| P (Packed Number) | 고정 소수점 (정확한 연산 필요 시 사용, 속도 F, I보다 느림) | 0 | 1~16 |
| Character Types | - | - | - |
| C (Text Field) | 고정 길이 문자열 | 없음 | 1~655315 |
| N (Numeric Text Field) | 숫자로 이루어진 문자열 | 0 (길이 미지정 시 0) | 1~655315 |
| Hexadecimal Type | - | - | - |
| X (Hexadecimal Field) | 고정 길이 바이너리 | 0 (길이 * 2, 길이 미지정 시 00) | 1~655315 |
1.3. 변수 선언 예제
1.3.1. 숫자형 데이터 선언
DATA lv_item_count TYPE I. " 항목 개수 (정수형 4바이트)
DATA lv_large_number TYPE INT8. " 큰 정수값 저장 (정수형 8바이트)
DATA lv_conversion_rate TYPE F. " 변환율, 백분율 등 (부동 소수점 8바이트)
DATA lv_price TYPE P LENGTH 8 DECIMALS 2. " 가격, 금액 저장 (고정 소수점 2자리)
DATA lv_precise_amount TYPE DECFLOAT16. " 정밀한 금액 연산 (16자리 부동 소수점)
DATA lv_high_precision TYPE DECFLOAT34. " 높은 정밀도의 숫자 값 (34자리 부동 소수점)1.3.2. 문자형 데이터 선언
DATA lv_username TYPE C LENGTH 20. " 사용자 이름 (고정 길이 문자열 20자리)
DATA lv_invoice_number TYPE N LENGTH 8. " 송장 번호 등 숫자로 이루어진 문자열 (8자리)
DATA lv_description TYPE STRING. " 설명, 상세 내용 (가변 길이 문자열)1.3.3. 날짜 및 시간 데이터 선언
DATA lv_order_date TYPE D. " 주문 날짜 (YYYYMMDD)
DATA lv_order_time TYPE T. " 주문 시간 (HHMMSS)
DATA lv_timestamp TYPE UTCLONG. " UTC 타임스탬프 (정확한 시간 기록)1.3.4. 바이너리 및 헥사데시멀 데이터 선언
DATA lv_file_header TYPE X LENGTH 4. " 파일 헤더 정보 (고정 길이 바이너리 4바이트)
DATA lv_image_data TYPE XSTRING. " 이미지 데이터 저장 (가변 길이 바이너리)1.3.5 SAP 화면 관련 변수 선언
DATA lv_screen_number TYPE SCREEN. " 화면 번호 저장2. Local Data Type
ABAP 프로그램 내에서만 유효한 데이터 타입입니다.
프로그램에서 필요한 데이터 타입을 직접 정의해서 사용할 수 있습니다.
2.1. TYPES
커스텀 타입 정의
TYPES를 활용하면 재사용성이 증가하여 유지보수가 편해짐
TYPES ty_amount TYPE p LENGTH 10 DECIMALS 2. " 통화 금액 타입
TYPES ty_text TYPE c LENGTH 100. " 문자 타입2.2. DATA
변수를 타입을 참고하여 선언
DATA lv_amount TYPE ty_amount. " 커스텀 타입 사용LIKE를 사용하면 다른 변수 또는 데이터 오브젝트의 타입을 참조할 수 있습니다.
DATA lv_total LIKE lv_amount. " lv_amount의 타입과 동일한 타입 선언📌 TYPE vs LIKE 차이점
| 구분 | TYPE | LIKE |
|---|---|---|
| 기준 | 데이터 타입을 기준으로 변수 선언 | 기존 변수(또는 필드)를 기준으로 변수 선언 |
| 적용 대상 | Predefined Type, Local Type, Dictionary Type | 이미 선언된 변수(또는 구조체 필드) |
| 특징 | 명확한 데이터 타입을 사용하여 재사용 가능 | 특정 변수의 속성을 그대로 복사 |
💡 TIP
TYPE을 사용하는 것이 일반적으로 더 명확하며 재사용성이 높지만,
LIKE는 기존 필드와 동일한 타입을 유지해야 할 때 유용합니다.
2.3. Structured Type
구조체 선언
ABAP에서는 구조체(Structure)를 사용하여 여러 개의 필드를 하나의 타입으로 정의할 수 있습니다.
" 구초제 TYPE 선언
TYPES: BEGIN OF ty_person,
name TYPE c LENGTH 50,
age TYPE i,
email TYPE c LENGTH 100,
END OF ty_person.
" 구조체 변수 선언
DATA ls_person TYPE ty_person.💡 TIP
구조체는 데이터의 논리적 그룹화를 가능하게 하며, 테이블의 행(Row)처럼 사용할 수 있습니다.
= 서로 관련된 여러 개의 필드를 하나의 단위로 묶어 관리할 수 있다.
2.4. Include Type vs. Include Structure
INCLUDE 구문은 기존에 정의된 구조체를 다른 구조체에 포함시키는 데 사용되며,
이를 통해 코드 중복을 줄이고, 구조체를 재사용할 수 있습니다.
INCLUDE TYPE과 INCLUDE STRUCTURE는 다른 타입의 구조체를 포함하는 방식에 차이가 있습니다.
이 둘의 차이점은 주로 타입 일치 여부와 사용 목적에 달려 있습니다.
2.4.1. Include Type
INCLUDE TYPE은 타입을 포함하는 방식으로, 포함되는 구조체의 타입이 일치해야 합니다.
INCLUDE TYPE을 사용하면, 필드와 타입이 동일한 다른 구조체를 포함할 수 있습니다.
INCLUDE TYPE은 타입이 동일해야 하기 때문에, 다른 구조체의 타입을 일치시켜야 합니다.
TYPES: BEGIN OF ty_address,
street TYPE c LENGTH 50,
city TYPE c LENGTH 30,
END OF ty_address.
TYPES: BEGIN OF ty_customer,
id TYPE i,
name TYPE c LENGTH 50,
INCLUDE TYPE ty_address, " 같은 타입의 구조체만 포함
END OF ty_customer.ty_address 구조체는 ty_customer에 포함되어 사용되며, 필드와 타입이 일치해야 합니다.
2.4.2. Include Structure
INCLUDE STRUCTURE는 타입이 달라도 상관없습니다.
INCLUDE STRUCTURE는 다른 구조체의 필드만 포함하는 방식이기 때문에,
타입이 다르더라도 구조체를 포함시킬 수 있습니다.
INCLUDE STRUCTURE는 타입에 관계없이 필드만 가져오므로 다양한 구조체를 포함할 수 있습니다.
TYPES: BEGIN OF ty_address,
street TYPE c LENGTH 50,
city TYPE c LENGTH 30,
END OF ty_address.
TYPES: BEGIN OF ty_person,
name TYPE c LENGTH 50,
age TYPE i,
END OF ty_person.
TYPES: BEGIN OF ty_customer,
id TYPE i,
name TYPE c LENGTH 50,
INCLUDE STRUCTURE ty_address, " 필드만 포함
INCLUDE STRUCTURE ty_person, " 다른 타입의 구조체도 포함 가능
END OF ty_customer.ty_customer 구조체는 ty_address와 ty_person 구조체의 필드만 포함하고 있습니다.
이때 두 구조체는 타입이 다르지만 필드를 가져오기 때문에 문제 없이 포함됩니다.
2.5. BEGIN OF … END OF
BEGIN OF ... END OF 구문은 구조체(Structure)나 내부 테이블(Internal Table)의 행(Row)을 정의할 때 사용됩니다.
2.5.1. 구조체 및 내부 테이블의 라인 타입 정의
BEGIN OF와 END OF를 사용하여 구조체를 정의할 수 있습니다.
구조체를 정의한 후, 이를 내부 테이블의 라인 타입으로 사용할 수 있습니다.
TYPES: BEGIN OF ty_employee, " 구조체 정의 시작
id TYPE i,
name TYPE c LENGTH 50,
dept TYPE c LENGTH 30,
END OF ty_employee. " 구조체 정의 끝
TYPES: tt_employee TYPE TABLE OF ty_employee. " 내부 테이블 타입 정의
DATA gt_employee TYPE tt_employee. " 내부 테이블 선언ty_employee : 구조체로, 각 필드를 정의합니다.
tt_employee : 내부 테이블 타입을 정의합니다. ty_employee 구조체를 라인 타입으로 사용합니다.
gt_employee : ty_employee 구조체가 각 라인의 데이터로 포함된 내부 테이블을 선언합니다.
2.5.2. 구조체 없이 BEGIN OF ... END OF 사용
구조체를 정의하지 않고 임시적인 데이터 그룹화가 필요한 경우,
BEGIN OF와 END OF를 사용하여 구조체를 선언 없이 바로 변수에 사용할 수 있습니다.
DATA: BEGIN OF ls_employee, " 임시 구조체 선언 시작
id TYPE i,
name TYPE c LENGTH 50,
dept TYPE c LENGTH 30,
END OF ls_employee. " 임시 구조체 선언 종료이 경우, ls_employee는 임시 구조체로 선언됩니다.
3. Global Data Type 및 Dictionary Type
3.1. Global Data Type ≒ Dictionary Type
- Global Data Type은 SAP Dictionary에서 정의된 데이터 타입으로, 전역적으로 사용 가능
- 테이블, 구조체, 데이터 요소 등의 형태로 존재하며, 일관된 데이터 관리가 가능
- ABAP 프로그램에서 변수, 내부 테이블, 필드 선언 시 활용 가능
3.2. Global Data Type 종류
| 타입 | 설명 |
|---|---|
| 도메인 (Domain) | 값의 속성(길이, 소수점, 유효값 등) 정의 |
| 데이터 요소 (Data Element) | 도메인에 추가적인 설명을 더하여 필드 수준에서의 의미를 부여 |
| 테이블 타입 (Table Type) | 내부 테이블을 정의할 때 사용 |
| 구조체 (Structure) | 여러 필드로 구성된 데이터 구조 |
| 타입 그룹 (Type Group) | 여러 관련 타입을 하나의 그룹으로 묶어 관리 |
3.3. DDIC 타입
ABAP DDIC(Data Dictionary)에서 정의된 타입을 활용해 변수를 선언할 수 있습니다.
3.3.1. Table, View를 이용한 TYPE 선언
DATA: gt_spfli TYPE TABLE OF spfli, " spfli 테이블 타입 (전체 테이블)
gs_spfli TYPE spfli, " spfli 구조체 타입 (테이블 한 줄)
gv_carrid TYPE spfli-carrid. " spfli 테이블의 특정 필드 타입 선언gt_spfli : spfli 테이블 타입을 따르는 내부 테이블
gs_spfli : spfli 테이블에서 한 줄의 레코드를 담는 구조체
gv_carrid: spfli 테이블에서 carrid 필드의 타입을 직접 사용하는 변수
3.3.2. Data Type을 이용한 TYPE 선언
DATA: gv_matnr TYPE matnr, " SAP 표준 데이터 요소 (자재 번호)
gv_carrid TYPE s_carr_id, " SAP 표준 데이터 요소 (항공사 코드)
gs_str TYPE zstruct. " 사용자 정의 구조체 (커스텀 데이터 구조)gv_matnr : SAP 표준 데이터 타입인 자재 번호 matnr 를 사용하는 변수
gv_carrid: SAP 표준 데이터 요소인 항공사 코드 s_carr_id 를 사용하는 변수
gs_str: 사용자 정의 구조체 zstruct 를 사용하는 구조체
3.3.3. Type Group을 이용한 TYPE 선언
타입 타입 그룹은 여러 데이터 타입을 하나의 그룹으로 묶어 공통적으로 관리하고 사용할 수 있게 해줍니다.
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv. " SLIS 타입 그룹 사용slis_t_fieldcat_alv : ALV(Grid) 필드 카탈로그 정의 시 사용하는 표준 타입 그룹 (SLIS)
(SAP에서 제공하는 SLIS 타입 그룹을 활용하면 ALV 필드 설정이 쉬워집니다)
4. 기타 변수 선언
4.1. CONSTANTS
변경되지 않는 값은 CONSTANTS로 선언하면 안정성이 높아집니다.
CONSTANTS c_pi TYPE p LENGTH 5 DECIMALS 2 VALUE '3.14'. " 고정된 상수
CONSTANTS c_text TYPE c LENGTH 10 VALUE 'Hello'. " 문자형 상수4.2. STATICS
정적 변수는 프로그램 실행 동안 값을 유지합니다.
함수나 서브루틴을 호출할 때마다 값이 초기화되지 않고 이전 값을 그대로 유지합니다.
STATICS: lv_counter TYPE i. " 정적 변수 선언4.3. TABLES
TABLES는 내부 테이블을 선언하는 구식 방식입니다.
현재는 DATA를 사용하는 방식이 표준이지만, 이전 방식에서 사용된 코드입니다.
이 방법은 SAP R/3 (Real-Time 3-Tier) 시스템에서 사용되었으며,
현재는 ABAP 7.40 이상에서는 DATA를 사용하여 테이블을 선언하는 것이 표준입니다.
TABLES: sflight. " 내부 테이블 선언 (구식 방식)5. 시스템 변수
SAP에서는 미리 정의된 시스템 변수를 제공하여
현재 날짜, 시간, 사용자 정보, 시스템 상태 등을 쉽게 가져올 수 있습니다.
이러한 시스템 변수는 주로 디버깅이나 로그 기록, 시스템 상태 확인 등을 위해 사용됩니다.
5.1. 시스템 날짜 및 시간
| 시스템 변수 | 설명 | 예제 값 |
|---|---|---|
SY-DATUM | 현재 날짜 (YYYYMMDD) | 20250221 |
SY-UZEIT | 현재 서버 시간 (HHMMSS) | 134500 |
SY-TIMLO | 현재 사용자 로컬 시간 | 134500 |
SY-TZONE | 현재 시간대 오프셋 (UTC와의 차이) | UTC+09 |
5.2. 사용자 및 시스템 정보
| 시스템 변수 | 설명 | 예제 값 |
|---|---|---|
SY-UNAME | 현재 사용자 ID | KANGH |
SY-MANDT | 클라이언트 (SAP 시스템의 클라이언트 ID) | 100 |
SY-SYSID | 시스템 ID (SAP 시스템의 이름) | DV1 |
SY-CLIENT | 현재 클라이언트 정보 | 100 |
SY-LSIND | 시스템 리소스의 인덱스 번호 | 0 |
SY-REPID | 현재 실행 중인 Report ID | Z_SALES_REPORT |
5.3. 트랜잭션 및 프로그램
| 시스템 변수 | 설명 | 예제 값 |
|---|---|---|
SY-TCODE | 현재 실행 중인 트랜잭션 코드 | SE80 |
SY-PROG | 현재 실행 중인 프로그램의 이름 | ZPROGRAM |
SY-CPROG | 호출된 프로그램의 이름 | ZCUSTOM |
SY-DYNNR | 현재 다이내믹 화면 번호 | 100 |
5.4. 실행 및 상태
| 시스템 변수 | 설명 | 예제 값 |
|---|---|---|
SY-SUBRC | 마지막 실행 명령어의 성공 여부 (0: 성공, 4: 실패 등) | 0 |
SY-ERRNR | 오류 번호 (오류 발생 시) | 002 |
SY-EDLFM | 마지막 처리된 라인의 번호 | 102 |
SY-ELINE | 현재 처리 중인 소스 코드의 줄 번호 | 10 |
SY-BATCH | 배치 모드 여부 (0: 대화형, 1: 배치) | 0 |
SY-DYNNR | 현재 다이내믹 화면 번호 | 100 |
SY-LANG | 언어 코드 | EN |
SY-MSGID | 마지막 메시지의 ID | ZMSG |
SY-MSGNO | 마지막 메시지 번호 | 000 |
SY-MSGTY | 마지막 메시지 유형 (I: 정보, E: 오류 등) | I |
SY-MSGV1,SY-MSGV2, SY-MSGV3,SY-MSGV4 | 마지막 메시지의 상세 값 | Text1,Text2, Text3,Text4 |
5.5. 커서 및 화면
| 시스템 변수 | 설명 | 예제 값 |
|---|---|---|
SY-CUCOL | 현재 커서의 열 번호 | 10 |
SY-CULINE | 현재 커서의 행 번호 | 5 |
SY-LVAR | 화면의 마지막 필드 | FIELD1 |
SY-VLINE | 화면의 세로선 번호 | 20 |
예시 코드
DATA: lv_today TYPE D,
lv_time TYPE T,
lv_user TYPE SYST-UNAME.
lv_today = SY-DATUM. " 오늘 날짜
lv_time = SY-UZEIT. " 현재 시간
lv_user = SY-UNAME. " 사용자 IDSY- : ABAP 프로그램 실행 시에 관련된 시스템 변수
SYST- : 시스템 환경 및 상태 관련된 데이터 구조체
📌 마무리
SAP ABAP에서 데이터를 다루려면 적절한 데이터 타입을 선택하는 것이 중요합니다.
- Predefined Type: SAP에서 제공하는 기본 타입
- Local Type: 프로그램 내에서 정의한 커스텀 타입
- Global Type: SAP Dictionary(DDIC)에서 정의한 타입
특히, 변경이 잦다면 Local Type을 활용하고,
여러 프로그램에서 공통적으로 사용할 데이터라면 DDIC 타입을 활용하는 것이 좋습니다.
ABAP 데이터 타입을 완벽하게 이해하고 실무에 적용해 봅시다.
최근 게시글
