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

ABAP New Syntax #6 - BASE Operator

by SAPortal 2024. 3. 4.

목차

    1. BASE Operator 란?

    BASE 연산자는 주로 구조체 또는 내부 테이블을 확장하거나 수정할 때 사용됩니다.

    이 연산자를 사용하면 기존의 데이터 구조체나 테이블에 새로운 필드를 추가하거나, 기존 필드의 값을 변경하면서 새로운 인스턴스를 생성할 수 있습니다.

    이 방법은 기존 데이터를 유지하면서 확장된 새로운 구조체나 테이블을 생성할 때 코드를 더 간결하고 가독성 있게 만들어 줍니다.

     

    2. BASE Operator 예제

    예제1) 구조체 확장

    TYPES: BEGIN OF TY_PERSON,
             NAME   TYPE STRING,
             AGE    TYPE I,
             WEIGHT TYPE I,
           END OF TY_PERSON.
    
    DATA: LS_PERSON TYPE TY_PERSON.
    
    LS_PERSON = VALUE #( NAME = 'John Doe' AGE = 30 ).
    
    LS_PERSON = VALUE #( BASE LS_PERSON WEIGHT = 50 ).
    
    [RESULT]
    John Doe	30	50

    VALUE 연산자를 사용하게 되면 TARGET(LS_PERSON)변수의 값이 CLEAR되면서 값을 대입히게 됩니다.

    TARGET(LS_PERSON)변수의 값을 유지하면서 특정 필드의 값만 바꾸고자 할때 BASE 연산자를 사용합니다.

    BASE로 지정된 구조체(LS_PERSON)에 WEIGHT의 값만 50으로 대입하여 TARGET(LS_PERSON)변수에 반영합니다.

     

    TYPES: BEGIN OF TY_PERSON,
             NAME   TYPE STRING,
             AGE    TYPE I,
             WEIGHT TYPE I,
           END OF TY_PERSON.
    
    TYPES: BEGIN OF TY_PERSON2,
             AGE    TYPE I,
             WEIGHT TYPE I,
           END OF TY_PERSON2.
    
    DATA: LS_PERSON TYPE TY_PERSON,
          LS_SOURCE TYPE TY_PERSON2.
    
    LS_PERSON = VALUE #( NAME = 'John Doe' AGE = 30 WEIGHT = 50 ).
    LS_SOURCE = VALUE #( AGE = 25 WEIGHT = 60 ).
    
    LS_PERSON = CORRESPONDING #( BASE ( LS_PERSON ) LS_SOURCE ).
    
    [RESULT]
    John Doe	25	60

    CORRESPONDING 연산자도 마찬가지로 BASE로 지정된 구조체(LS_PERSON)의 값에 SOURCE(LS_SOURCE)구조체를 CORRESPONDING하여 TARGET(LS_PERSON) 구조체에 반영합니다.

    위 예제에서 BASE 연산자를 사용안하면 NAME필드의 값이 사라지게 됩니다.

     

     

    예제2) 테이블 값추가

    TYPES: BEGIN OF TY_PERSON,
             NAME   TYPE STRING,
             AGE    TYPE I,
             WEIGHT TYPE I,
           END OF TY_PERSON.
    
    DATA: LT_PERSON TYPE TABLE OF TY_PERSON.
    
    LT_PERSON = VALUE #( ( NAME = 'John Doe' AGE = 30 WEIGHT = 50 ) ).
    
    LT_PERSON = VALUE #( BASE LT_PERSON ( NAME = 'Jane Doe' AGE = 25 WEIGHT = 45 )  ).
    
    [RESULT]
    John Doe	30	50
    Jane Doe	25	45

    테이블도 마찬가지로 VALUE 연산자를 사용하게 되면 TARGET(LT_PERSON)변수의 값이 CLEAR되면서 값을 대입히게 됩니다.

    위 예제에서 BASE 연산자를 사용하지 않으면 LT_PERSON의 값은 'Jane Doe     25      45' 만 남게 됩니다.

    TARGET(LT_PERSON)변수의 값을 유지하면서 DATA를 추가하고자 할때 BASE 연산자를 사용하면 됩니다.

     

    TYPES: BEGIN OF TY_PERSON,
             NAME   TYPE STRING,
             AGE    TYPE I,
             WEIGHT TYPE I,
           END OF TY_PERSON.
    
    TYPES: BEGIN OF TY_PERSON2,
             AGE    TYPE I,
             WEIGHT TYPE I,
           END OF TY_PERSON2.
    
    DATA: LT_PERSON TYPE TABLE OF TY_PERSON,
          LT_SOURCE TYPE TABLE OF TY_PERSON2.
    
    LT_PERSON = VALUE #( ( NAME = 'John Doe' AGE = 30 WEIGHT = 50 ) ).
    LT_SOURCE = VALUE #( ( AGE = 25 WEIGHT = 60 ) ).
    
    LT_PERSON = CORRESPONDING #( BASE ( LT_PERSON ) LT_SOURCE ).
    
    [RESULT]
    John Doe	30	50
     	        25	60

    CORRESPONDING 연산자도 BASE로 지정된 테이블(LT_PERSON)에 SOURCE(LT_SOURCE)테이블의 값을 추가한 후 TARGET(LT_PERSON)테이블에 반영합니다.

     

     

    3. BASE Operator의 장점

    유연성: 기존 데이터 구조체나 내부 테이블을 기반으로 새로운 인스턴스를 쉽게 확장하거나 수정할 수 있습니다.

    가독성: 기존 인스턴스를 복사하고 변경 사항을 명확하게 지정함으로써, 코드의 의도를 쉽게 파악할 수 있습니다.

    효율성: 기존 데이터의 재사용을 통해 코드 중복을 줄이고, 개발 프로세스를 간소화할 수 있습니다.