본문 바로가기
카테고리 없음

ABAP 기초 #5 - USING, CHANGING, TABLES

by SAPortal 2024. 3. 23.

목차

    1. USING, CHANGING, TABLES 란?

    USING, CHANGING 그리고 TABLES는 서브루틴(PERFORM문)에 파라미터를 전달하는 방식입니다.

    다른곳에서도 사용하지만 이번 기초강의에서는 PERFORM문으로 설명을 드리겠습니다.

    이전시간에 PERFORM문은 ABAP소스코드를 모듈화하여 가독성을 높이고 재사용을 할 수 있다고 배웠습니다.

    그 PERFORM문 안쪽으로 DATA를 전달하고 사용하기 위해서 USING, CHANGING, TABLES를 사용합니다.

     

    여기서 값을 전달하는 방식이 2가지가 있는데 값만 전달하는 방식과 참조에 의한 전달방식이 있습니다.

    보통 참조에 의한 전달방식을 많이 쓰기 때문에 이번장에서는 참조에 의한 전달방식만 설명드리고 다음장에서 두 방식의 차이점에 대하여 설명드리겠습니다.

     

    USING문 특징

    보통 SINGLE값(변수, 구조체)을 파라미터로 전달할때 사용합니다. PERFORM문 안쪽에서는 받은 파라미터를 읽기전용으로 사용됩니다.

     

    CHANGING문 특징

    CHANGING문 역시 SINGLE 값(변수, 구조체)을 파라미터로 전달할때 사용합니다. PERFORM문 안쪽에서는 받은 파라미터를 읽거나 수정도 가능합니다.

     

    TABLES문 특징

    TABLE정보를 파라미터로 전달할때 사용합니다. PERFORM문 안쪽에서는 받은 파라미터를 읽거나 수정도 가능합니다.

     

     

    2. USING, CHANGING, TABLES 예제

    USING문 예제

    DATA: LV_NUMBER1 TYPE I VALUE 5,
          LV_NUMBER2 TYPE I VALUE 10.
    
    PERFORM CALCULATE_SUM USING LV_NUMBER1
                                LV_NUMBER2.
    
    
    FORM CALCULATE_SUM  USING    PV_VALUE1 TYPE I
                                 PV_VALUE2 TYPE I.
      DATA: LV_SUM TYPE I.
      LV_SUM = PV_VALUE1 + PV_VALUE2.
    ENDFORM.

    두개의 정소를 더하는 로직을 서브루틴(CALCULATE_SUM)을 사용하여 작성하였습니다.

    서브루틴을 보면 2개의 정수를 받기위해 USING문을 사용하였습니다.

    서브루틴 안쪽으로 들어가면 역시 2개의 정수를 받기위해 USING문을 사용하고 PV_VALUE1, PV_VALUE2를 선언하고 순서에 맞게 값을 전달받습니다.

     

    위에서 참조에 의한 전달이라고 했었는데 LV_NUMBER1 = PV_VALUE1라고 이해하시면 됩니다.

    서브루틴 안쪽에서의 PV_VALUE1은 5이고 PV_VALUE2는 10입니다. 즉 LV_SUM값은 15입니다.

    만약 서브루틴 안쪽에서 PV_VALUE1값을 수정하면 어떻게 될까요? LV_NUMBER1 = PV_VALUE1라고 했기때문에 수정하는 순간 LV_NUMBER1 값도 즉시 바뀝니다.

     

    그런데 이상한게 있습니다. 위에서 이야기 하기를 USING문은 입력받은 파라미터를 읽기전용으로 사용한다고 했는데 이번 예제에서는 수정을 했습니다.

    네.. 사실 USING문은 입력받은 파라미터를 읽기전용으로 사용하는 목적의 키워드지만 수정도 가능합니다.

     

    CHANGING문 예제

    DATA: LV_NUMBER1 TYPE I VALUE 5,
          LV_NUMBER2 TYPE I VALUE 10.
    
    PERFORM CALCULATE_SUM CHANGING LV_NUMBER1
                                   LV_NUMBER2.
    
    
    FORM CALCULATE_SUM  CHANGING PV_VALUE1 TYPE I
                                 PV_VALUE2 TYPE I.
      DATA: LV_SUM TYPE I.
      LV_SUM = PV_VALUE1 + PV_VALUE2.
    ENDFORM.

    USING예제에서 USING을 CHANGING으로만 바꿨습니다. 결과는 동일합니다.

    참조에 의한 전달방식에서는 USING과 CHANGING의 차이점이 없습니다. 

    하지만 목적에 맞게 읽기전용이면 USING을 사용하고 수정할 목적이면 CHANGING을 쓰는게 가독성 측면에서도 좋을것 같습니다.

     

    USING, CHANGING문 구조체 사용예제

    DATA: LS_SFLIGHT1 TYPE SFLIGHT,
          LS_SFLIGHT2 TYPE SFLIGHT.
    
    PERFORM CHECK_FLIGHT_INFO    USING LS_SFLIGHT1
                              CHANGING LS_SFLIGHT2.
    
    
    FORM CHECK_FLIGHT_INFO     USING PS_SFLIGHT1 TYPE SFLIGHT
                            CHANGING PS_SFLIGHT2 TYPE SFLIGHT.
      WRITE PS_SFLIGHT1-CARRID.
      WRITE PS_SFLIGHT2-CARRID.
    ENDFORM.

    위 예제와 같이 USING, CHANGING문을 통해 구조체 정보를 서브루틴으로 전달할수도 있습니다.

     

    TABLES문 예제

    DATA: LT_SFLIGHT TYPE TABLE OF SFLIGHT.
    
    PERFORM CHECK_FLIGHT_INFO TABLES LT_SFLIGHT.
    
    FORM CHECK_FLIGHT_INFO TABLES PT_SFLIGHT STRUCTURE SFLIGHT.
      READ TABLE PT_SFLIGHT INDEX 1.
      IF SY-SUBRC = 0.
        WRITE PT_SFLIGHT-CARRID.
      ENDIF.
    ENDFORM.

    INTERNAL TABLE 정보를 서브루틴으로 전달할때 TABLES문을 사용합니다.

    서브루틴 안쪽에서 해당 INTERNAL TABLE의 타입을 STRUCTURE문으로 선언한걸 볼수 있습니다.

     

    다음시간에는 참조전달방식이 아닌 값전달방식을 알아보고 차이점은 무엇인지 확인해 보겠습니다.