SAP ABAP

SAP ABAP New Syntax: 더 간결하고 효율적인 코딩을 위한 변화

두잉머니맨 2025. 7. 7. 15:06

SAP ABAP은 지속적으로 발전하며 개발자들에게 더 편리하고 효율적인 코딩 환경을 제공하고 있습니다.

특히 NetWeaver 7.40 버전부터 도입된 New Syntax는 기존의 다소 길고 반복적이었던 코드들을 더 간결하고 가독성 높게 작성할 수 있도록 혁신적인 변화를 가져왔습니다.

아직도 예전 문법으로 ABAP 코딩을 하고 있다면, 지금부터 New Syntax의 핵심들을 익혀 더욱 스마트한 개발자로 거듭날 수 있습니다!


1. 인라인 선언 (Inline Declaration)

가장 빈번하게 사용되며 코드 가독성을 크게 높여주는 기능입니다. 변수나 필드 심볼을 미리 선언할 필요 없이, 해당 변수가 처음 사용되는 시점에 바로 선언할 수 있습니다.

  • DATA(변수명) = ...
  • FIELD-SYMBOL(<필드심볼명>) TYPE ...

기존 문법:

ABAP
 
DATA: lv_name TYPE string,
      lv_age  TYPE i.

lv_name = '홍길동'.
lv_age = 30.

New Syntax:

ABAP
 
DATA(lv_name) = '홍길동'.
DATA(lv_age)  = 30.

Field Symbol:

ABAP
 
FIELD-SYMBOLS: <ls_data> TYPE any.

LOOP AT lt_table ASSIGNING <ls_data>.
  " <ls_data> 사용
ENDLOOP.

New Syntax:

ABAP
 
LOOP AT lt_table ASSIGNING FIELD-SYMBOL(<ls_data>).
  " <ls_data> 사용
ENDLOOP.

데이터를 읽을 때도 인라인 선언을 활용할 수 있습니다.

ABAP
 
READ TABLE lt_table INTO DATA(ls_row) INDEX 1.
IF sy-subrc = 0.
  " ls_row 사용
ENDIF.

2. 값 전달 표현식 (Value Operator - VALUE)

내부 테이블, 구조체, 변수 등을 초기화하거나 값을 할당할 때 더욱 직관적인 방법을 제공합니다.

  • DATA(변수명) = VALUE 타입( 초기화값 )

기존 문법:

 
TYPES: BEGIN OF ty_s_person,
         name TYPE string,
         age  TYPE i,
       END OF ty_s_person.

DATA: ls_person TYPE ty_s_person.

ls_person-name = '김철수'.
ls_person-age  = 25.

New Syntax:

 
TYPES: BEGIN OF ty_s_person,
         name TYPE string,
         age  TYPE i,
       END OF ty_s_person.

DATA(ls_person) = VALUE ty_s_person( name = '김철수' age = 25 ).

내부 테이블 초기화 및 값 할당도 가능합니다.

 
TYPES: BEGIN OF ty_s_item,
         item_no   TYPE i,
         item_name TYPE string,
       END OF ty_s_item,
       ty_t_item TYPE STANDARD TABLE OF ty_s_item WITH EMPTY KEY.

DATA(lt_items) = VALUE ty_t_item(
                     ( item_no = 1 item_name = '노트북' )
                     ( item_no = 2 item_name = '마우스' )
                     ( item_no = 3 item_name = '키보드' )
                 ).

3. 필터 표현식 (Filter Operator - FILTER)

내부 테이블에서 특정 조건을 만족하는 행들만 필터링하여 새로운 테이블을 만들 때 사용합니다. LOOP AT WHERE보다 간결하고 직관적입니다.

  • FILTER 타입( 테이블명 WHERE 조건 )

기존 문법:

 
TYPES: BEGIN OF ty_s_data,
         id   TYPE i,
         name TYPE string,
         type TYPE char1,
       END OF ty_s_data,
       ty_t_data TYPE STANDARD TABLE OF ty_s_data WITH EMPTY KEY.

DATA: lt_original TYPE ty_t_data,
      lt_filtered TYPE ty_t_data.

" lt_original 에 데이터가 있다고 가정
LOOP AT lt_original INTO DATA(ls_row) WHERE type = 'A'.
  APPEND ls_row TO lt_filtered.
ENDLOOP.

New Syntax:

 
TYPES: BEGIN OF ty_s_data,
         id   TYPE i,
         name TYPE string,
         type TYPE char1,
       END OF ty_s_data,
       ty_t_data TYPE STANDARD TABLE OF ty_s_data WITH EMPTY KEY.

DATA: lt_original TYPE ty_t_data.
" lt_original 에 데이터가 있다고 가정

DATA(lt_filtered) = FILTER ty_t_data( lt_original WHERE type = 'A' ).

4. 조건 표현식 (Conditional Operator - COND, SWITCH)

IF-ELSE 또는 CASE 문을 대체하여 변수에 값을 할당할 때 사용합니다. 특히 짧은 조건문에서 코드를 매우 간결하게 만듭니다.

COND (Conditional)

  • COND #( 조건1 THEN 값1 ELSE 값2 )

기존 문법:

 
DATA: lv_score TYPE i VALUE 85,
      lv_grade TYPE string.

IF lv_score >= 90.
  lv_grade = 'A'.
ELSEIF lv_score >= 80.
  lv_grade = 'B'.
ELSE.
  lv_grade = 'C'.
ENDIF.

New Syntax:

 
DATA(lv_score) = 85.
DATA(lv_grade) = COND string( WHEN lv_score >= 90 THEN 'A'
                              WHEN lv_score >= 80 THEN 'B'
                              ELSE 'C' ).

SWITCH

  • SWITCH #( 비교값 WHEN 값1 THEN 결과1 WHEN 값2 THEN 결과2 ELSE 기본값 )

기존 문법:

DATA: lv_status TYPE char1 VALUE 'C',
      lv_text   TYPE string.

CASE lv_status.
  WHEN 'A'.
    lv_text = 'Active'.
  WHEN 'B'.
    lv_text = 'Blocked'.
  WHEN OTHERS.
    lv_text = 'Closed'.
ENDCASE.

New Syntax:

DATA(lv_status) = 'C'.
DATA(lv_text) = SWITCH string( lv_status
                               WHEN 'A' THEN 'Active'
                               WHEN 'B' THEN 'Blocked'
                               ELSE 'Closed' ).

5. 테이블 표현식 (Table Expression)

내부 테이블에서 특정 키나 인덱스를 사용하여 원하는 행의 값을 읽을 때 사용합니다. READ TABLE 문을 대체하며, 결과가 없을 때 예외 처리가 용이합니다.

  • 내부테이블명[ 조건 ] 또는 내부테이블명[ 인덱스 ]

기존 문법:

 
TYPES: BEGIN OF ty_s_product,
         id   TYPE string,
         name TYPE string,
       END OF ty_s_product,
       ty_t_product TYPE STANDARD TABLE OF ty_s_product WITH EMPTY KEY.

DATA: lt_products TYPE ty_t_product,
      ls_product  TYPE ty_s_product.

" lt_products 에 데이터가 있다고 가정
READ TABLE lt_products INTO ls_product WITH KEY id = 'P001'.
IF sy-subrc = 0.
  DATA(lv_name) = ls_product-name.
ENDIF.

New Syntax:

 
TYPES: BEGIN OF ty_s_product,
         id   TYPE string,
         name TYPE string,
       END OF ty_s_product,
       ty_t_product TYPE STANDARD TABLE OF ty_s_product WITH EMPTY KEY.

DATA: lt_products TYPE ty_t_product.
" lt_products 에 데이터가 있다고 가정

TRY.
    DATA(lv_name) = lt_products[ id = 'P001' ]-name.
  CATCH cx_sy_itab_line_not_found. " 해당 키의 데이터가 없을 경우
    " 에러 처리 로직
    lv_name = 'Not Found'.
ENDTRY.

" 인덱스로 접근
TRY.
    DATA(lv_first_name) = lt_products[ 1 ]-name.
  CATCH cx_sy_itab_line_not_found.
    lv_first_name = 'No Data'.
ENDTRY.

6. 스트링 템플릿 (String Templates)

문자열을 조합하거나 동적으로 생성할 때 사용합니다. 기존의 CONCATENATE 또는 WRITE 문보다 훨씬 직관적이고 강력합니다.

  • | 텍스트 {변수/표현식} 텍스트 |

기존 문법:

DATA: lv_name  TYPE string VALUE '개발자',
      lv_place TYPE string VALUE '판교'.

DATA: lv_message TYPE string.
CONCATENATE lv_name '님, 환영합니다. 현재 위치는' lv_place '입니다.' INTO lv_message.

New Syntax:

DATA: lv_name  TYPE string VALUE '개발자',
      lv_place TYPE string VALUE '판교'.

DATA(lv_message) = |{ lv_name }님, 환영합니다. 현재 위치는 { lv_place }입니다.|.

포맷팅 옵션도 다양하게 제공합니다.

 
DATA(lv_number) = 12345.
DATA(lv_formatted) = |숫자: { lv_number COUNTRY = 'KR' }|. " 결과: 숫자: 12,345
DATA(lv_date) = sy-datum.
DATA(lv_date_formatted) = |날짜: { lv_date DATE = ISO }|. " 결과: 날짜: 2025-07-07

7. NEW 연산자 (인스턴스 생성)

클래스 인스턴스를 생성할 때 CREATE OBJECT 대신 NEW 연산자를 사용하여 코드를 간결하게 만듭니다.

기존 문법:

CLASS lcl_test DEFINITION.
  PUBLIC SECTION.
    METHODS constructor IMPORTING iv_value TYPE i.
    METHODS get_value RETURNING VALUE(rv_value) TYPE i.
  PRIVATE SECTION.
    DATA: mv_value TYPE i.
ENDCLASS.

CLASS lcl_test IMPLEMENTATION.
  METHOD constructor.
    mv_value = iv_value.
  ENDMETHOD.
  METHOD get_value.
    rv_value = mv_value.
  ENDMETHOD.
ENDCLASS.

DATA: lo_test TYPE REF TO lcl_test.
CREATE OBJECT lo_test EXPORTING iv_value = 100.
DATA(lv_value) = lo_test->get_value( ).

New Syntax:

CLASS lcl_test DEFINITION.
  PUBLIC SECTION.
    METHODS constructor IMPORTING iv_value TYPE i.
    METHODS get_value RETURNING VALUE(rv_value) TYPE i.
  PRIVATE SECTION.
    DATA: mv_value TYPE i.
ENDCLASS.

CLASS lcl_test IMPLEMENTATION.
  METHOD constructor.
    mv_value = iv_value.
  ENDMETHOD.
  METHOD get_value.
    rv_value = mv_value.
  ENDMETHOD.
ENDCLASS.

DATA(lo_test) = NEW lcl_test( iv_value = 100 ).
DATA(lv_value) = lo_test->get_value( ).

8. 기타 유용한 New Syntax 요소들

  • REDUCE: 내부 테이블의 데이터를 기반으로 단일 값을 계산할 때 사용합니다. 복잡한 집계 로직을 간결하게 표현할 수 있습니다.
  • FOR: 내부 테이블을 반복하면서 새로운 테이블을 생성하거나 값을 변환할 때 사용합니다. LOOP AT과 APPEND 조합보다 훨씬 간결합니다.
  • Reference Variable (REF TO DATA): 이제는 DATA(lr_ref) = REF #(변수) 와 같이 참조 변수를 인라인으로 선언할 수 있습니다.

New Syntax를 사용해야 하는 이유

  1. 가독성 향상: 코드가 간결해지고 직관적으로 변하여 이해하기 쉬워집니다.
  2. 생산성 증대: 반복적이고 긴 코드를 줄여 개발 시간을 단축할 수 있습니다.
  3. 오류 감소: 간결한 코드는 잠재적인 오류 발생 가능성을 줄여줍니다.
  4. 최신 트렌드 반영: ABAP 언어의 최신 트렌드와 발전을 따르며, 이는 곧 개발자의 경쟁력으로 이어집니다.

마무리하며

SAP ABAP New Syntax는 현대적인 프로그래밍 패러다임을 ABAP에 도입하여 개발자들이 더욱 효율적이고 즐겁게 코딩할 수 있도록 돕습니다. 처음에는 익숙하지 않아 어렵게 느껴질 수 있지만, 몇 번 사용해보면 그 편리함에 놀라실 거예요.

오늘 정리해드린 핵심 내용들을 바탕으로 실제 코딩에 적용해보세요. 점진적으로 New Syntax에 익숙해지면서 여러분의 ABAP 코드가 더욱 깔끔하고 강력해지는 것을 경험하게 될 겁니다! 혹시 더 궁금하거나 특정 기능에 대해 자세히 알고 싶은 부분이 있다면 언제든지 질문해주세요.