본문 바로가기

Easy Abap 2.0

[2주차] Chapter 5 Internal Table Part 1

1. OVERVIEW

 

Internal Table은 프로그램 내에서 정의하여 사용할 수 있는 Local Table이다.

 

1. 1 Structure(구조체) 비교

 

C언어와 ABAP 비교

구문 C언어 ABAP 언어
선언 STRUCT 구조체 { }; 1. DATA 구조체 TYPE 구조체 타입.
2. DATA 구조체 LIKE OBJECT.
3. DATA BEGIN OF 구조체~ END OF.
값 할당 sawon.name = 'Honggildong'; sawon-name = 'Honggildong'.
값 사용 PRINTF('%s', sawon.name)  WRITE sawon- name.

 

※ C언어와  ABAP 구조체 선언법은 유사하다. 다만 구조체는 사원 1명의 값만 할당하여 사용할 수 있다.

 

1. 2 Structure(구조체) 배열과 Internal Table

 

구문 C언어 ABAP 언어
선언 STRUCT 구조체[건수]  }; DATA 테이블명 TYPE 테이블 타입.
INITIAL SIZE 건수.
값 할당 sawon[1].name = 'Honggildong';
sawon[2].name = 'Kimchulsoo';
sawon-name = ' Honggildong'.
APPEND sawon.
sawon-name = ' Kimchulsoo'.
APPEND sawon.
값 사용 PRINTF( sawon[1].name )
PRINTF( sawon[2].name )
LOOP AT sawon.
      WRITE sawon-name.
ENDLOOP.

 

※ 구조체 배열과 인터널 테이블도 두 언어 사이에는 큰 차이가 없다.
다만 값을 할당하고 사용하는 구문의 차이가 있을 뿐이다.

C 언어의 구조체 배열은 배열 순번을 지정하여 값을 할당하여 사용한다.

반면, ABAP 언어의 인터널 테이블은 구조체 배열(ARRAY)의 개념을 모두 지원하며 추가로 실제 데이터베이스 모습과
유사하게 사용할 수 있도록 구현되었다.

 

C 언어가 배열을 선언할 때 미리 크기를 지정하는 반면, 인터널 테이블은 INITIAL SIZE 구문으로 테이블 크기만 선언할 뿐
미리 메모리에 Load 하지 않는다. 따라서 INSERT 또는 APPEND 구문을 사용하여 Line이 추가 될 때마다 
메모리에 Load  한다.

이러한 측면에서 Internal Table은 동적인 구조체 배열이고,
INITIAL SIZE 구문은 실제로 메모리 공간을 할당하는 것이 아니라 예약(RESERVE)을 한다.

 

1.3 Internal Table 생성

 

인터널 테이블은 구조체 타입을 정의하고 나서 그 타입을 참고하여 생성하는 것이 일반적이다.

다음 2가지 방법을 이용하여 인터널 테이블을 생성할 수 있다.

 

  • Local Table Type을 이용한 인터널 테이블 생성
  • Global ABAP Dictionary Type을 이용한 인터널 테이블 생성

 

 

2. 인터널 테이블과 헤더 라인

 

헤더 라인은 다른 말로 Work Area(구조체) 라고도 한다.

인터널 테이블 선언 시 WITH HEADER LINE 구문을 추가하면 생성된다.라인

헤더 라인이 있는 인터널 테이블 사용 시 어떠한 정보가 헤더 라인에 있는 지 주의해서 사용해야 한다.

 

헤더 라인이 없으면 Work Area(구조체)를 선언하고 나서 값을 복사한 다음 사용해야한다.

헤더 라인이 있으면 인터널 테이블의 이름은 ABAP 프로그램 내에서 헤더 라인을 의미하게 된다.

 

헤더 라인 사용에 따른 비교

 

Header Line이 없는 경우 명령어 Header Line이 있는 경우 명령어
모든 인터널 테이블(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 테이블(Standard, Sorted Type)
APPEND wa TO itab APPEND itab.
INSERT wa INTO itab... INSERT itab...
MODIFY itab FROM wa... MODIFY itab...

 

 

3. 인터널 테이블 종류

 

1) Stanadard Table

  • 순차적인 Index를 가지는 테이블이며, Tree 구조를 이루고 있다.
  • Index를 이용하여 테이블 Entry를 찾을 때 바람직한 테이블 구조이다.
  • READ, MODIFY 그리고 DELETE 구문을 사용할 때도 Index를 사용하게 된다.
  • 인터널 테이블에서의 Index는 단순히 인터널 테이블에서 데이터가 위치하는 라인 순번을 의미하며
    테이블의 Index와는 다른 개념이다.
  • Standard Table의 키는 항상 Non-unique로 선언하여야 한다. 즉  WITH UNIQUE 구문을 사용할 수 없다.

2) Sorted Table

 

  • 1) Standard Table과 2) Sorted Table은 Index Table이다.
  • Sorted Table은 Key값으로 항상 정렬된 인터널 테이블 타입이다.
    즉, 프로그래머가 원하는 Key값으로 항상 정렬된 결과로 인터널 테이블에 저장해야하는 경우에 사용한다.
  • Standard Table과는 다르게 WITH UNIQUE 구문 사용할 수 있다.
  • Sorted Table은 내부적으로 Binary Search를 이욯하기 때문에
    Table Entry의 수와 탐색 속도는 정적 상관관계를 갖는다.
  • Sorted Table로 선언할 때는 Unique/Non-unique를 반드시 명시하여야 한다.
  • Sorted Table은 이미 정렬되어 있기 때문에 Sort 명령어를 사용하면 오류가 발생한다.

 

3) Hashed Table

 

  • 순차적인 Index를 가지고 있지 않으며, Hash 값으로 계산된 Key 값으로만 탐색 가능하다.
  • 응답 속도는 인터널 테이블의 Entry 수와 상관없이 항상 같다.
  • 반드시 Unique하게 선언되어야 한다.
  • Hashed Table은 Index가 없기 때문에 READ TABLE ~ INDEX 구문을 사용할 수 없다.
    다만, READ TABLE~ WITH TABLE KEY 또는 WITH KEY 구문을 이용해서 
    인터널 테이블 데이터에 접근할 수는 있다.

인터널 테이블 구식 선언법

 

  • Rel 3.x 버전 이전에는 모든 인터널 테이블은 헤더 라인을 가지는 구문만이 사용 가능하였고, 
    이후 버전에도 호환성 문제로 계속 사용되기도 한다.
  • OCCURS 구문은 Rel 4.0 버전부터 사용 가능한 INITIAL SIZE와 같은 효과를 가진다
  • OCCURS는 시스템 실행 환경에서 인터널 테이블의 메모리 할당(또는 Line 수)을 의미하며, 
    0은 제한을 두지 않아 메모리 할당은 최소화한다.
  • 구식 방법으로 선언된 인터널 테이블은 Standard 테이블 타입만 지원된다.