SAP/Abap
[Internal Table] Internal table 개념
i009727
2022. 1. 19. 14:44
[Internal table: Overview]
Internal table이란 Abap언어에서 가장 강력한 기능을 제공하는 것중 하나로 프로그램 내에서 직접 정의해 사용이 가능한 local table이다.
- Abap의 internal table은 선언시 initial size를 지정하지만, 실제 메모리에는 해당 크기만큼 할당되지 않는다.
- 즉, INSERT 또는 UPDATE구문으로 테이블에 데이터가 추가될때마다 추가된 line만큼 실제 메모리가 할당된다.
- 선언된 initial size는 실제 메모리의 할당이 아닌 예약(reserve)의 의미를 갖는다.
- Internal table의 명령어는 항상 할당과 추가가 쌍을 이루어야 한다.
- 값이 할당되더라도 추가과정이 생략되면 internal table에는 해당 값이 존재하지 않는다.
- Internal table의 최대 가용 size는 메모리 크기로 한정되며, 기본 2GB를 차지한다.
Abap의 internal table은 동적인 구조체 배열(Dynamic Structure Array)이다.
[Internal table 생성]
일반적으로 Internal table은 해당하는 구조체 타입을 정의하고, 정의된 타입을 참고하여 생성된다.
1) Local Table Type을 이용한 인터널 테이블 생성
- 3단계 과정을 거쳐 인터널테이블을 생성한다.
# First => 구조체 타입 선언
TYPES : BEGIN OF t_str,
...
END OF t_str.
# Second => 구조체 타입을 참고하는 인터널 테이블 타입 선언
TYPES t_itab TYPE STANDARD TABLE OF t_str WITH...
# Third => 인터널테이블 타입을 참고하는 인터널테이블 선언
DATA : gt_itab TYPE t_itab.
- 일반적으로 실무에서는 위의 3개의 과정중 "Second" 과정을 제외한 2단계 선언법을 주로 사용한다.
- 즉, 인터널테이블 타입 선언 없이 구조체 타입을 참고하여 인터널테이블을 생성한다.
REPORT ZA05_01.
TYPES : BEGIN OF s_type, => 구조체 타입 선언
no(6) TYPE c,
name(10) TYPE c,
part(16) TYPE c,
END OF s_type.
DATA gt_itab TYPE STANDARD TABLE OF s_type => 선언된 구조체 타입을 참고하여 인터널테이블 생성
WITH NON-UNIQUE KEY no
WITH HEADER LINE.
gt_itab-no = '0001'.
gt_itab-name = 'Easy ABAP'.
gt_itab-part = 'SAP Team'.
APPEND gt_itab.
gt_itab-no = '0002'.
gt_itab-name = 'Easy JAVA'.
gt_itab-part = 'JAVA Team'.
APPEND gt_itab.
LOOP AT gt_itab.
WRITE :/ gt_itab-no, gt_itab-name, gt_itab-part.
ENDLOOP.
- 위의 코드의 인터널테이블 생성부에서 TYPES 대신 LIKE 구문을 사용할 수도 있다.
REPORT ZA05_01.
....
DATA gt_itab LIKE STANDARD TABLE OF gs_type
WITH NON-UNIQUE KEY no
WITH HEADER LINE.
....
2) Global abap dictionary type을 이용한 인터널테이블 생성
- Abap dictionary 테이블이나, 구조체를 참고하여 인터널 테이블을 생성할 수 있다.
REPORT ZA05_02.
DATA gt_itab TYPE SORTED TABLE OF scarr WITH UNIQUE KEY carrid.
DATA gs_str LIKE LINE OF gt_itab.
SELECT * INTO TABLE gt_itab FROM scarr.
LOOP AT gt_itab INTO gs_str.
WRITE :/ gs_str-carrid, gs_str-carrname.
ENDLOOP.
- 1) Local table type을 이용한 생성법과는 달리 위의 예제에서는 LOOP AT구문에서 INTO구문을 사용해야 반복문이 동작한다.
- 1)에서는 인터널테이블 생성시 WITH HEADER LINE 옵션을 줬지만, 2)에서는 해당 옵션을 주지 않았기 때문이다.
- 이후 파트에서 바로 학습할 예정이다.
[Internal table과 헤더 라인(Header line)]
Header line이란, Work area 이다.
즉, 인터널테이블의 헤더라인은 인터널테이블 내 다수의 데이터 중 현재 작업중인 영역, 즉 work area를 의미한다.
DATA <itab> TYPE <type> [WITH HEADER LINE].
- LOOP작업 수행
- Header line O: 개별 line이 차례대로 header line(work area)로 옮겨지고, 단순히 header line을 사용한다.
- EX) INSERT TABLE itab => INSERT TABLE itab FROM itab(header_line)
- Header line X: 별도의 work area(구조체 변수)가 선언한 후 개별 line을 work area에 복사하여 사용한다.
- EX) INSERT TABLE itab FROM wa
- Header line O: 개별 line이 차례대로 header line(work area)로 옮겨지고, 단순히 header line을 사용한다.
Header Line이 없는 경우 | Header Line이 있는 경우 |
모든 Internal Table(Standard, Sorted, Hashed Type) | |
INSERT wa INTO TABLE itab | INSERT TABLE itab |
COLLECT wa INTO itab | COLLECT itab |
READ TABLE itab... INTO wa | READ TABLE itab |
MODIFY TABLE itab FROM wa... | MODIFY TABLE itab... |
MODIFY itab FROM wa WHERE... | MODIFY itab WHERE... |
DELETE TABLE itab FROM wa | DELETE TABLE itab |
LOOP AT itab INTO wa | LOOP AT itab |
Index Table(Standard, Sorted Type) | |
APPEND wa TO itab | APPEND itab |
INSERT wa INTO itab | INSERT itab |
MODIFY itab FROM wa | MODIFY itab |
- Header line이 있는 Internal table
REPORT ZA05_03.
TYPES : BEGIN OF t_str,
col1 TYPE i,
col2 TYPE i,
END OF t_str.
DATA : gt_itab TYPE TABLE OF t_str WITH HEADER LINE.
DO 3 TIMES.
gt_itab-col1 = sy-index.
gt_itab-col2 = sy-index ** 2.
APPEND gt_itab.
ENDDO.
LOOP AT gt_itab.
WRITE :/ gt_itab-col1, gt_itab-col2.
ENDLOOP.
- Header line이 없는 Internal table
REPORT ZA05_04.
TYPES : BEGIN OF t_str,
col1 TYPE i,
col2 TYPE i,
END OF t_str.
DATA : gt_itab TYPE TABLE OF t_str.
DATA : gs_str LIKE LINE OF gt_itab.
DO 3 TIMES.
gs_str-col1 = sy-index.
gs_str-col2 = sy-index ** 2.
APPEND gs_str TO gt_itab..
ENDDO.
LOOP AT gt_itab INTO gs_str.
WRITE :/ gs_str-col1, gs_str-col2.
ENDLOOP.
- Abap언어에 객체지향(Object Oriented)이 도입되면서 클래스 내부에서의 header line사용이 지원되지 않고, 전체적으로 header line의 미사용이 권장되지만, legacy 프로그램에서의 영향력때문에 여전히 많이 사용되는 개념이다.
[Internal table의 종류]
인터널테이블의 종류는 테이블 내 개별 entry에 접근하는 방식에 따라 달라진다.
Table Type | Index 유무 | Key type | Search type | Search param |
Standard table | O | NON-UNIQUE | 순차탐색 | index, key |
Sorted table | O | UNIQUE | NON-UNIQUE | 이진탐색 | index, key |
Hashed table | X | UNIQUE | 해시값 탐색 | key의 해시값 |
1) Standard Table
DATA : itab TYPE STANDARD TABLE OF <t_str>
WITH NON-UNIQUE KEY <keys> [INITIAL SIZE <n>] [WITH HEADER LINE].
- Tree구조의 순차적 index 테이블.
- index: 인터널테이블 내 데이터들이 위치하는 라인순번.
- 테이블의 index와 key컬럼을 통해 개별 line의 데이터에 접근할 수 있다.
- Standard table은 순차탐색(sequential search)을 이용한다.
- Standard table의 key는 항상 WITH NON-UNIQUE로 선언되어야 한다.
REPORT ZA05_05.
TYPES : BEGIN OF t_line,
field1 TYPE c LENGTH 5,
field2 TYPE c LENGTH 4,
field3 TYPE i,
END OF t_line.
TYPES : t_tab TYPE STANDARD TABLE OF t_line
WITH NON-UNIQUE DEFAULT KEY.
DATA : gt_itab TYPE t_tab WITH HEADER LINE.
gt_itab-field1 = 'Enjoy'.
gt_itab-field2 = 'Abap'.
gt_itab-field3 = 1.
APPEND gt_itab.
READ TABLE gt_itab INDEX 1.
WRITE :/ gt_itab-field1, gt_itab-field2, gt_itab-field3.
- KEY
- DEFAULT KEY: 인터널테이블의 Type c의 모든 컬럼을 key컬럼으로 정의
- User defined key: 개발자가 명시한 컬럼만 key컬럼으로 정의
- ex) DATA gt_itab TYPE STANDARD TABLE OF t_line WITH KEY field1.
- READ TABLE
- 인터널테이블의 개별 line에 접근할 수 있는 구문.
- ex) READ TABLE gt_itab INDEX 1. => gt_itab 인터널테이블의 1번째 line 데이터를 READ.
- 인터널테이블의 인덱스(index)뿐만 아니라 key 컬럼 값을 통해서도 개별 데이터에 접근이 가능하다.
- key 컬럼 값을 통해 접근하기 위해서는 해당 테이블의 key컬럼 전체를 기술해야한다.
- ex) READ TABLE gt_itab WITH TABLE KEY field1 = 'Enjoy' field2 = 'Abap'.
- 인터널테이블의 개별 line에 접근할 수 있는 구문.
2) Sorted Table
DATA : itab TYPE STANDARD TABLE OF <t_str>
WITH [UNIQUE | NON-UNIQUE] KEY <keys> [INITIAL SIZE <n>] [WITH HEADER LINE].
- 항상 Table의 key값으로 정렬된 index 테이블.
- 테이블의 index와 key컬럼을 통해 개별 line의 데이터에 접근할 수 있다.
- Sorted table의 key는 WITH UNIQUE 또는 WITH NON-UNIQUE로 선언될 수 있다.
- Sorted table은 이진탐색(binary search)을 이용한다.
- Sorted table에서는 APPEND구문 대신 INSERT구문을 사용해야 한다.
- APPEND구문 사용시 정렬과정에서 dump error가 발생함.
REPORT ZA05_06.
TYPES : BEGIN OF t_line,
col TYPE c,
seq TYPE i,
END OF t_line.
TYPES : t_tab TYPE SORTED TABLE OF t_line
WITH UNIQUE KEY col.
DATA : gt_itab TYPE t_tab WITH HEADER LINE.
gt_itab-col = 'B'.
gt_itab-seq = '1'.
INSERT TABLE gt_itab.
gt_itab-col = 'A'.
gt_itab-seq = '2'.
INSERT TABLE gt_itab.
CLEAR gt_itab.
READ TABLE gt_itab INDEX 2.
WRITE : / gt_itab-col, gt_itab-seq.
3) Hashed Table
DATA : itab TYPE STANDARD TABLE OF <t_str>
WITH UNIQUE KEY <keys> [INITIAL SIZE <n>] [WITH HEADER LINE].
- Standard, Sorted table과는 달리 index table이 아니다.
- 테이블의 key컬럼만을 통해 개별 line의 데이터에 접근할 수 있다.
- Hash값은 hash 알고리즘을 통해 계산된 key값을 의미한다.
- 계산된 hash값을 통해 탐색이 이루어지며, 이를 통해 메모리에 저장된 주소값으로 직접 데이터에 접근이 가능하다.
- Hashed table의 key는 항상 WITH UNIQUE로 선언되어야 한다.
REPORT ZA05_07.
TYPES : BEGIN OF t_line,
col TYPE c,
seq TYPE i,
END OF t_line.
TYPES : t_tab TYPE HASHED TABLE OF t_line
WITH UNIQUE KEY col.
DATA : gt_itab TYPE t_tab WITH HEADER LINE.
gt_itab-col = 'B'.
gt_itab-seq = '1'.
INSERT TABLE gt_itab.
gt_itab-col = 'A'.
gt_itab-seq = '2'.
INSERT TABLE gt_itab.
CLEAR gt_itab.
READ TABLE gt_itab WITH TABLE KEY col = 'A'.
WRITE : / gt_itab-col, gt_itab-seq.
[Internal table : 속도비교]
Table type | Search type | Search speed(Big O) | Total speed |
Standard table | Sequential search(순차탐색) | O(n) | APPEND 속도 빠름 / READ 속도 느림 |
Sorted table | Binary search(이진탐색) | O(log(n)) | APPEND 속도 가장 느림 / READ 속도 빠름 |
Hashed table | Hashed search(해시탐색) | O(1) | APPEND 속도 느림 / READ 속도 가장 빠름 |