복합 내부 테이블 선언

Objective

After completing this lesson, you will be able to 복합 내부 테이블(Internal Table)을 선언합니다.

복합 내부 테이블의 속성

지금까지 사용한 내부 테이블에는 스칼라 데이터 유형이 행 유형으로 사용되었습니다. 이 그림의 예에서 내부 테이블(Internal Table) 번호의 행 유형은 ABAP 기본 제공 유형 I입니다.

이러한 종류의 내부 테이블을 단순 내부 테이블(Internal Table)이라고 합니다.

행 유형이 구조화 데이터 유형인 경우 복합 내부 테이블(Internal Table)을 사용합니다.

단순 내부 테이블에는 이름 없는 열이 하나만 있는 반면, 복잡한 내부 테이블은 각각 구조화된 행 유형의 해당 컴포넌트 이름과 유형을 가진 여러 열로 구성됩니다. 이 예에서 내부 테이블(Internal Table connections)의 행 유형은 다섯 가지 컴포넌트(carrier_id,, connection_id, airport_to_id, airport_from_id, carrier_name)의 구조화된 유형입니다. 따라서 내부 테이블 connections 해당 이름을 가진 5개의 열이 있습니다.

노트

그림 '다시 알림: 구조화된 행 유형이 있는단순 내부 테이블(Internal Table) 및 내부 테이블(Internal Table)' 그림의 열에 스칼라 유형이 모두 있습니다. 더 일반적으로 내부 테이블(Internal Table)의 열은 구조화된 유형이거나 테이블 유형일 수도 있습니다. 후자의 경우 중첩된 내부 테이블에 대해 이야기합니다.

지금까지 내부 테이블(Internal Table)의 행을 위치별로 처리했습니다. 이를 인덱스 액세스라고 합니다.

복합 내부 테이블의 명명된 열을 사용하면 키 액세스가 더 중요해집니다. 키 액세스는 특정 열의 특정 값을 찾아 내부 테이블의 행을 처리하는 것을 의미합니다. 검색하는 열은 내부 테이블(Internal Table)의 모든 열이 될 수 있습니다.

내부 테이블에 행이 많더라도 내부 테이블에 대한 인덱스 액세스는 항상 매우 빠릅니다. 그러나 테이블에 행이 많으면 키 액세스가 매우 느려질 수 있습니다. 내부 테이블에 적합한 액세스 유형을 선택하면 키 액세스 성능이 향상될 수 있습니다.

모든 테이블의 액세스 유형은 세 가지 중 하나입니다. 액세스 유형은 데이터가 테이블에 저장되는 방식을 결정하고, 이를 기반으로 시스템에서 데이터를 검색하기 위해 테이블을 읽는 방법을 결정합니다.

각 테이블 유형은 다음과 같습니다.

표준 테이블
표준 테이블에서는 내용이 특정 정렬 순서대로 저장되지 않습니다. 기본적으로 신규 레코드는 테이블 끝 부분에 추가됩니다. 키별로 데이터를 검색하려면 시스템에서 순차적으로 읽어야 하므로 테이블이 매우 크면 검색 시간이 길어질 수 있습니다. 지금까지 사용한 단순 내부 테이블은 표준 테이블이었습니다.
정렬 테이블
정렬 테이블에서는 테이블 내용이 항상 키 필드에 따라 오름차순으로 정렬됩니다. 테이블에 신규 레코드를 삽입하면 시스템에서 해당 레코드가 올바른 위치에 배치되었는지 확인합니다. 데이터가 항상 정렬되므로 특정 규칙을 따르기만 하면 표준 테이블에 비해 더 효율적으로 레코드를 검색할 수 있습니다.
해시 테이블
해시 테이블은 특정 해시 알고리즘을 사용하여 관리됩니다. 이를 통해 매우 큰 테이블에서도 매우 빠르게 레코드를 검색할 수 있습니다. 그러나 이러한 성능상의 이점은 매우 특별한 경우에만 해당됩니다.

모든 내부 테이블에는 키가 있습니다. 표준 테이블에서는 키가 특별히 중요하게 사용되지 않습니다. 정렬 테이블과 해시 테이블에서는 키를 통해 테이블의 데이터를 관리하는 방법이 결정되므로 키가 매우 중요합니다. 중요한 점은 키 액세스에서 키 필드의 전체 또는 최소 하위 세트를 처리하는 정렬 테이블과 해시 테이블만 더 빠릅니다.

테이블 키의 또 다른 특성은 고유성입니다. 필요에 따라 내부 테이블의 엔트리 복제를 허용해야 할 수도 있고, 키가 고유한지 확인해야 할 수도 있습니다. 이러한 경우 다음 규칙이 적용됩니다.

  • 표준 테이블에서 항상 중복이 허용됩니다.
  • 해시 테이블에는 중복이 허용되지 않습니다.
  • 정렬 테이블의 경우 정의에서 키가 고유한지 아니면 비고유한지를 선택합니다.

노트

내부 테이블에는 보조 키가 있을 수도 있습니다. 보조 키는 다양한 필드 조합을 사용하는 내부 테이블에 대한 키 액세스 성능을 향상시키는 방법입니다. 보조 키에 대한 자세한 내용은 ABAP 구문 문서에서 확인할 수 있습니다.

복합 테이블 유형

복합 내부 테이블(Internal Table)의 선언에 대한 몇 가지 예를 보려면 이 동영상을 보십시오.

또한 데이터 유형을 먼저 정의한 다음 해당 유형을 참조하는 변수를 생성하는 것이 좋은 프로그래밍 스타일입니다.

DATA 문에서 내부 테이블의 액세스 유형과 키를 지정하는 대신 이름이 지정된 테이블 유형을 사용해야 합니다. 메소드에서 또는 지정된 클래스와 관련하여 테이블 유형만 로컬로 필요한 경우 TYPES 문을 사용하여 테이블 유형을 정의할 수 있습니다.

이 예에서는 먼저 구조화된 유형 st_connection 을 정의합니다. 이 구조화된 유형을 행 유형으로 사용하면 테이블 유형 tt_connections 를 정의합니다. 마지막으로 내부 테이블 connections_5의 선언은 테이블 유형을 참조합니다.

테이블 유형이 전역적으로 필요한 경우 전역 테이블 유형을 사용할 수 있습니다.

전역 테이블 유형은 시스템 어디에서나 데이터 유형으로 사용할 수 있는 저장소 오브젝트입니다. ADT는 이러한 종류의 저장소 오브젝트를 위한 전용 편집기를 제공합니다. 이 툴은 다음 프레임으로 구성됩니다.

다음 비디오에서는 테이블 유형을 로컬로 정의하는 방법을 보여줍니다.

사용해 보기: 복합 테이블 유형

  1. 이 과정의 첫 번째 연습문제와 마찬가지로 인터페이스 IF_OO_ADT_CLASSRUN을 구현하는 신규 전역 클래스를 생성합니다.
  2. 다음 코드 스니핏을 메소드 if_oo_adt_classrun~main( ) 의 구현 부분에 복사합니다.
    Code Snippet
    12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
    TYPES: BEGIN OF st_connection, carrier_id TYPE /dmo/carrier_id, connection_id TYPE /dmo/connection_id, airport_from_id TYPE /dmo/airport_from_id, airport_to_id TYPE /dmo/airport_to_id, carrier_name TYPE /dmo/carrier_name, END OF st_connection. * Example 1 : Simple and Complex Internal Table ********************************************************************** " simple table (scalar row type) DATA numbers TYPE TABLE OF i. " complex table (structured row type) DATA connections TYPE TABLE OF st_connection. out->write( `--------------------------------------------` ). out->write( `Example 1: Simple and Complex Internal Table` ). out->write( data = numbers name = `Simple Table NUMBERS:`). out->write( data = connections name = `Complex Table CONNECTIONS:`). * Example 2 : Complex Internal Tables ********************************************************************** " standard table with non-unique standard key (short form) DATA connections_1 TYPE TABLE OF st_connection. " standard table with non-unique standard key (explicit form) DATA connections_2 TYPE STANDARD TABLE OF st_connection WITH NON-UNIQUE DEFAULT KEY. " sorted table with non-unique explicit key DATA connections_3 TYPE SORTED TABLE OF st_connection WITH NON-UNIQUE KEY airport_from_id airport_to_id. " sorted hashed with unique explicit key DATA connections_4 TYPE HASHED TABLE OF st_connection WITH UNIQUE KEY carrier_id connection_id. * Example 3 : Local Table Type ********************************************************************** TYPES tt_connections TYPE SORTED TABLE OF st_connection WITH UNIQUE KEY carrier_id connection_id. DATA connections_5 TYPE tt_connections. * Example 4 : Global Table Type ********************************************************************** DATA flights TYPE /dmo/t_flight. out->write( `------------------------------------------` ). out->write( `Example 4: Global Table TYpe /DMO/T_FLIGHT` ). out->write( data = flights name = `Internal Table FLIGHTS:` ).
  3. 키보드에서 CTRL + F3 을 눌러 클래스를 활성화하고 F9 를 눌러 콘솔 앱을 실행합니다.
  4. 콘솔 출력을 분석합니다. 프로그램을 디버그하고 소스 코드를 사용하여 개념을 숙지합니다.