단순 내부 테이블(Internal Table) 사용

Objectives

After completing this lesson, you will be able to:
  • 단순 내부 테이블(Internal Table)을 정의한다.
  • 간단한 내부 테이블을 사용하여 데이터 처리

단순 내부 테이블(Internal Table) 정의

유형

내부 테이블은 동일한 유형의 여러 값을 저장할 수 있는 변수 데이터 오브젝트입니다. 이 유형을 선언에 지정해야 하며 내부 테이블(Internal Table)의 행 유형이라고 합니다.

각 값은 내부 테이블(Internal Table)의 한 행을 차지합니다. 행 수는 제한되지 않습니다. 이론적으로 하나의 내부 테이블에 값을 원하는 수만큼 저장할 수 있습니다. 제한은 사용 가능한 메모리 또는 시스템 구성과 같은 기술적 경계에서만 발생합니다.

내부 테이블의 초기 값은 빈 테이블이거나, 즉 라인이 0인 테이블입니다. 내부 테이블(Internal Table)을 입력하는 기법에는 여러 가지가 있습니다. 이 예에서는 APPEND 문을 사용하여 내부 테이블 끝에 신규 행을 추가하고 값으로 채웁니다.

테이블 유형

내부 테이블(Internal Table)의 유형을 테이블 유형이라고 합니다.

앞의 예에서는 DATA 문에서 TYPE TABLE OF를 직접 사용했습니다. 테이블 유형이 선언된 변수에 바인딩되었습니다.

또는 TYPES 문에서 TYPE TABLE OF 를 사용하여 이름이 있는 테이블 유형을 정의할 수 있습니다. 그런 다음 DATA 문 등에서 이 테이블 유형을 사용할 수 있습니다. 이러한 유형의 표시 여부는 TYPES 문의 위치에 따라 달라집니다.

ABAP 딕셔너리에는 테이블 유형도 있습니다. 이 테이블 유형은 전용 편집기로 관리됩니다. 시스템 내 어디에서나 볼 수 있기 때문에 전역 테이블 유형이라고 합니다.

단순 내부 테이블을 사용한 데이터 처리

이 동영상에서 APPEND 문으로 내부 테이블을 채우는 방법을 알아보십시오.

내부 테이블의 초기 값은 비어 있는 테이블, 즉 행이 0인 내부 테이블입니다.

CLEAR 문을 사용하면 ABAP 변수를 유형별 초기 값으로 재설정할 수 있다는 것을 이미 배웠습니다.

내부 테이블(Internal Table)에 CLEAR을 사용하면 해당 내용이 모두 삭제되고 행 수가 0으로 설정됩니다.

내부 테이블에서 데이터를 검색하는 방법에는 여러 가지가 있습니다. 다음 예에서는 내부 테이블 식을 사용하여 단일 행의 내용을 검색합니다. 테이블식에서 내부 테이블 이름 바로 뒤에 한 쌍의 꺾쇠 괄호가 붙습니다. 괄호 안의 정수 표현식은 읽을 행의 위치를 지정합니다.

참고:

올바른 구문은 여는 대괄호 뒤와 닫는 대괄호 앞에 공백이 하나 이상 있어야 합니다.

루프의 내부 테이블에서 읽기

다음 동영상에서는 루프의 내부 테이블에서 읽을 수 있는 방법을 보여줍니다.

내부 테이블(Internal Table)에 루프를 구현할 때 DATA 문을 사용하여 작업 영역을 명시적으로 선언하는 대신 추가 요소 INTO 뒤에 인라인 선언을 사용할 수 있습니다.

이를 통해 입력해야 하는 코드 양을 줄일 수 있을 뿐만 아니라 작업 영역 유형이 내부 테이블의 라인 유형에 맞는지 확인할 수 있습니다. 인라인 선언 데이터 오브젝트의 유형은 컨텍스트에서 파생되기 때문입니다. 이 경우 내부 테이블이기 때문입니다.

사용해 보기: 단순 내부 테이블(Internal Table)

  1. 이 과정의 첫 번째 연습문제와 마찬가지로 인터페이스 IF_OO_ADT_CLASSRUN을 구현하는 신규 전역 클래스를 생성합니다.
  2. 다음 코드 스니핏을 if_oo_adt_classrun~main( ) 메소드의 구현 부분에 복사합니다.
    Code Snippet
    12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
    * Declarations ********************************************************************** " Internal tables DATA numbers TYPE TABLE OF i. "Table type (local) TYPES tt_strings TYPE TABLE OF string. DATA texts1 TYPE tt_strings. " Table type (global) DATA texts2 TYPE string_table. " work areas DATA number TYPE i VALUE 1234. DATA text TYPE string. * Example 1: APPEND ********************************************************************** APPEND 4711 TO numbers. APPEND number TO numbers. APPEND 2 * number TO numbers. out->write( `-----------------` ). out->write( `Example 1: APPEND` ). out->write( `-----------------` ). out->write( numbers ). * Example 2: CLEAR ********************************************************************** CLEAR numbers. out->write( `----------------` ). out->write( `Example 2: CLEAR` ). out->write( `----------------` ). out->write( numbers ). * Example 3: table expression ********************************************************************** APPEND 4711 TO numbers. APPEND number TO numbers. APPEND 2 * number TO numbers. out->write( `---------------------------` ). out->write( `Example 3: Table Expression` ). out->write( `---------------------------` ). number = numbers[ 2 ] . out->write( |Content of row 2: { number }| ). "Direct use of expression in string template out->write( |Content of row 1: { numbers[ 1 ] }| ). * Example 4: LOOP ... ENDLOOP ********************************************************************** out->write( `---------------------------` ). out->write( `Example 4: LOOP ... ENDLOOP` ). out->write( `---------------------------` ). LOOP AT numbers INTO number. out->write( |Row: { sy-tabix } Content { number }| ). ENDLOOP. * Example 5: Inline declaration in LOOP ... ENDLOOP ********************************************************************** out->write( `-----------------------------` ). out->write( `Example 5: Inline Declaration` ). out->write( `-----------------------------` ). LOOP AT numbers INTO DATA(number_inline). out->write( |Row: { sy-tabix } Content { number_inline }| ). ENDLOOP.
  3. CTRL + F3 을 눌러 클래스를 활성화하고 F9 를 눌러 콘솔 앱으로 실행합니다.
  4. 콘솔 출력을 분석합니다. 소스 코드를 사용하여 개념을 숙지합니다.

단순 내부 테이블 사용

이번 연습문제에서는 반복과 단순 내부 테이블을 사용하여 피보나치(Fibonacci) 숫자를 계산하고 조회합니다.

노트

피보나치 수(Fibonacci number)는 각각의 수가 앞의 두 개의 수를 합한 일련의 수이다. 순서는 0과 1로 시작하며 각 후속 번호는 이전 두 숫자의 합계입니다. 순서에는 수학, 컴퓨터 과학, 자연, 예술 등의 분야에서 다양한 수학적 속성, 패턴, 응용 프로그램이 있다.

템플릿:

  • 없음

솔루션:

  • /LRN/CL_S4D400_BTS_ITERATE(전역 클래스)

태스크 1: 숫자 계산

패키지에 신규 전역 클래스를 생성합니다. 반복 횟수에 대한 상수와 피보나치 번호에 대한 내부 테이블을 정의합니다. 그런 다음 반복에서 피보나치 수를 계산하여 내부 테이블에 저장합니다.

단계

  1. IF_OO_ADT_CLASSRUN 인터페이스를 구현하는 신규 전역 클래스를 생성합니다(제안 이름: ZCL_##_ITERATE, ##은 그룹 번호).

    1. 파일신규ABAP 클래스 를 선택합니다.

    2. 패키지 필드에 패키지 이름을 입력합니다. 이름 필드에 이름 ZCL_##_ITERATE 를 입력합니다. 여기서 ##은 그룹 번호입니다.

    3. 내역을 입력하십시오.

    4. 인터페이스 그룹 상자에서 추가 를 선택합니다.

    5. IF_OO_ADT_CLASSRUN 을 입력합니다. 인터페이스가 적중 리스트에 표시되면 더블 클릭하여 클래스 정의에 추가합니다.

    6. 다음을 선택합니다.

    7. 전송 요청을 선택하고 Finish 를 선택합니다.

  2. IF_OO_ADT_CLASSRUN~MAIN 메소드에서 반복 횟수에 대한 상수(제안 이름: max_count)를 작은 값(예: 20)으로 정의합니다.

    1. 다음 코드를 추가합니다.

      Code Snippet
      123
      CONSTANTS max_count TYPE i VALUE 20.
  3. Fibonacci 번호를 저장하도록 단순 내부 테이블(권장 이름: 숫자)을 선언합니다.

    1. 다음 코드를 추가합니다.

      Code Snippet
      123
      DATA numbers TYPE TABLE OF i.
  4. max_count 시간이 실행되는 반복을 구현합니다.

    1. 신고 뒤에 다음 코드를 추가합니다.

      Code Snippet
      12345
      DO max_count TIMES. ENDDO.
  5. 반복 내에서 기본 제공 반복 카운터를 기준으로 케이스 구분을 구현합니다. 첫 번째 반복에서 내부 테이블 번호에값 0을 추가합니다. 두 번째 반복에서 내부 테이블 번호 끝에 값 1 을 추가합니다.

    힌트

    기본 제공 반복 카운터는 시스템 필드 sy-index 입니다.
    1. DOENDDO 사이에 다음 코드를 추가합니다.

      Code Snippet
      12345678
      CASE sy-index. WHEN 1. APPEND 0 TO numbers. WHEN 2. APPEND 1 TO numbers. ENDCASE.
  6. 다른 모든 값에 대해 실행되는 분기를 추가합니다. 이 분기에서 새로운 엔트리를 숫자로 된 두 개의 선행 엔트리의 합계로 계산합니다.

    힌트

    인덱스 sy-index - 1sy-index - 2 를 사용하여 선행 엔트리에 액세스합니다.
    1. 코드를 다음과 같이 조정합니다.

      Code Snippet
      123456789101112
      CASE sy-index. WHEN 1. APPEND 0 TO numbers. WHEN 2. APPEND 1 TO numbers. WHEN OTHERS. APPEND numbers[ sy-index - 2 ] + numbers[ sy-index - 1 ] TO numbers. ENDCASE.

태스크 2: 서식이 지정된 출력 준비

내부 테이블(Internal Table)에 대한 루프에서 각 Fibonacci 번호를 각각의 순번으로 나열하는 서식이 지정된 출력을 준비합니다. 문자열 행 유형의 다른 내부 테이블에서 출력을 준비합니다.

단계

  1. if_oo_adt_classrun~main 메소드 시작 부분에서 문자열 행 유형의 내부 테이블(제안 이름: 출력)을 선언합니다.

  2. 내부 테이블 번호에 대한 루프를 구현하여 피보나치 번호를 하나씩 가변 번호로 읽습니다.

    힌트

    번호 에는 인라인 선언을 사용합니다.
    1. 메소드 끝에 다음 코드를 추가합니다.

      Code Snippet
      12345
      LOOP AT numbers INTO DATA(number). ENDLOOP.
  3. 루프 전에 0으로 설정하고 각 반복에서 1씩 증가한다는 정수 변수(제안 이름: 카운터)를 선언합니다.

    힌트

    카운터 에 인라인 선언을 사용할 수 있습니다.
    1. 코드를 다음과 같이 조정합니다.

      Code Snippet
      12345678
      DATA(counter) = 0. LOOP AT numbers INTO DATA(number). counter = counter + 1. ENDLOOP.
  4. 각 반복에서 카운터의 내용(가로 4자, 왼쪽 맞춤), 콜론(:), 숫자 내용(너비 10, 오른쪽 맞춤)이 포함된 내부 테이블 출력에 신규 행을 추가합니다.

    힌트

    적절한 형식 옵션이 있는 문자열 템플릿을 사용하여 형식을 조정합니다.
    1. 코드를 다음과 같이 조정합니다.

      Code Snippet
      1234567891011
      DATA(counter) = 0. LOOP AT numbers INTO DATA(number). counter = counter + 1. APPEND |{ counter WIDTH = 4 ALIGN = LEFT }: { number WIDTH = 10 ALIGN = RIGHT }| TO output. ENDLOOP.

태스크 3: 출력 및 테스트

콘솔에 결과를 기록합니다. 그런 다음 콘솔 앱으로 클래스를 활성화하고 테스트합니다.

단계

  1. 메소드 끝에서 out->write 메소드를 호출하여 출력 내용을 콘솔에 기록합니다. 임포트 매개변수 이름에 적절한 캡션을 제공합니다.

    1. ENDLOOP. 뒤에 다음 코드를 추가합니다.

      Code Snippet
      123456
      out->write( data = output name = |The first { max_count } Fibonacci Numbers| ) .
  2. 클래스를 활성화합니다.

    1. Ctrl + F3 을 눌러 클래스를 활성화합니다.

  3. 클래스를 콘솔 앱으로 실행합니다.

    1. F9 를 눌러 클래스를 콘솔 앱으로 실행합니다.