SAP ABAP은 지속적으로 발전하며 개발자들에게 더 편리하고 효율적인 코딩 환경을 제공하고 있습니다.
특히 NetWeaver 7.40 버전부터 도입된 New Syntax는 기존의 다소 길고 반복적이었던 코드들을 더 간결하고 가독성 높게 작성할 수 있도록 혁신적인 변화를 가져왔습니다.
아직도 예전 문법으로 ABAP 코딩을 하고 있다면, 지금부터 New Syntax의 핵심들을 익혀 더욱 스마트한 개발자로 거듭날 수 있습니다!
1. 인라인 선언 (Inline Declaration)
가장 빈번하게 사용되며 코드 가독성을 크게 높여주는 기능입니다. 변수나 필드 심볼을 미리 선언할 필요 없이, 해당 변수가 처음 사용되는 시점에 바로 선언할 수 있습니다.
- DATA(변수명) = ...
- FIELD-SYMBOL(<필드심볼명>) TYPE ...
기존 문법:
DATA: lv_name TYPE string,
lv_age TYPE i.
lv_name = '홍길동'.
lv_age = 30.
New Syntax:
DATA(lv_name) = '홍길동'.
DATA(lv_age) = 30.
Field Symbol:
FIELD-SYMBOLS: <ls_data> TYPE any.
LOOP AT lt_table ASSIGNING <ls_data>.
" <ls_data> 사용
ENDLOOP.
New Syntax:
LOOP AT lt_table ASSIGNING FIELD-SYMBOL(<ls_data>).
" <ls_data> 사용
ENDLOOP.
데이터를 읽을 때도 인라인 선언을 활용할 수 있습니다.
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를 사용해야 하는 이유
- 가독성 향상: 코드가 간결해지고 직관적으로 변하여 이해하기 쉬워집니다.
- 생산성 증대: 반복적이고 긴 코드를 줄여 개발 시간을 단축할 수 있습니다.
- 오류 감소: 간결한 코드는 잠재적인 오류 발생 가능성을 줄여줍니다.
- 최신 트렌드 반영: ABAP 언어의 최신 트렌드와 발전을 따르며, 이는 곧 개발자의 경쟁력으로 이어집니다.
마무리하며
SAP ABAP New Syntax는 현대적인 프로그래밍 패러다임을 ABAP에 도입하여 개발자들이 더욱 효율적이고 즐겁게 코딩할 수 있도록 돕습니다. 처음에는 익숙하지 않아 어렵게 느껴질 수 있지만, 몇 번 사용해보면 그 편리함에 놀라실 거예요.
오늘 정리해드린 핵심 내용들을 바탕으로 실제 코딩에 적용해보세요. 점진적으로 New Syntax에 익숙해지면서 여러분의 ABAP 코드가 더욱 깔끔하고 강력해지는 것을 경험하게 될 겁니다! 혹시 더 궁금하거나 특정 기능에 대해 자세히 알고 싶은 부분이 있다면 언제든지 질문해주세요.