ABAP 7.40부터 코드가 확 짧아졌다. 변수를 미리 선언하지 않아도 되고(`DATA(x)`), 값을 한 줄로 조립하고(`VALUE`), 내부 테이블을 대괄호로 읽고(`itab[ ... ]`), 문자열을 `|...{ }...|`로 만든다. ECC 시절(7.0x) 코드를 S/4HANA(7.5x)에서 손볼 때 개발자가 가장 먼저 부딪히는 격차가 바로 이 신문법이다. 이 글은 자주 쓰는 신문법을 "옛 방식 → 신문법" Before/After로 정리한다. 어느 릴리스부터 되는지(SP)도 같이 표기하니, 본인 시스템 버전에 맞춰 쓰면 된다. S/4HANA는 7.5x라 아래 전부 사용 가능하고, 구형 ECC(7.0x/7.31)면 일부는 안 될 수 있다. ## 어느 버전부터 되나 | 신문법 | 최초 릴리스 | |---|---| | 인라인 선언 `DATA( )`, `FIELD-SYMBOL( )` | 7.40 SP02 | | 생성자 표현식 `VALUE` `NEW` `CONV` `CAST` `CORRESPONDING` | 7.40 SP02~SP05 | | 조건 표현식 `COND` `SWITCH` | 7.40 SP05 | | 테이블식 `itab[ ]`, `line_exists( )` | 7.40 | | `FOR` 반복, `REDUCE`, `FILTER` (테이블 변환·집계·필터) | 7.40 SP08 | | 문자열 템플릿 `\|...{ }...\|` | 7.02 / 7.40 | | Open SQL 호스트 변수 `@`, `INTO @DATA( )` | 7.40 SP08 / 7.50 | ## 1. 인라인 선언 — 쓰는 자리에서 선언 가장 먼저 체감되는 변화. 변수를 상단에 미리 선언하지 않고 값을 받는 자리에서 바로 선언한다. ```abap " 옛 방식 — 위에서 미리 선언 DATA lv_text TYPE string. DATA lt_mara TYPE TABLE OF mara. SELECT * FROM mara INTO TABLE lt_mara. DATA ls_mara TYPE mara. LOOP AT lt_mara INTO ls_mara. ENDLOOP. " 신문법 (7.40 SP02) — 쓰는 자리에서 DATA(lv_text) = `hello`. SELECT * FROM mara INTO TABLE @DATA(lt_mara). LOOP AT lt_mara INTO DATA(ls_mara). ENDLOOP. ``` ## 2. VALUE — 값·구조체·테이블을 한 줄로 `APPEND`를 반복하거나 구조체 필드를 하나씩 채우던 코드를 한 줄로. ```abap " 옛 방식 DATA lt_num TYPE TABLE OF i. APPEND 1 TO lt_num. APPEND 2 TO lt_num. APPEND 3 TO lt_num. DATA ls_flight TYPE sflight. ls_flight-carrid = 'LH'. ls_flight-connid = '0400'. " 신문법 (7.40) DATA(lt_num) = VALUE int4_table( ( 1 ) ( 2 ) ( 3 ) ). DATA(ls_flight) = VALUE sflight( carrid = 'LH' connid = '0400' ). ``` ## 3. 테이블식 & line_exists — READ TABLE 대체 키로 한 줄을 읽을 때 `READ TABLE ... WITH KEY` + `sy-subrc` 패턴을 대괄호 표현식으로 줄인다. ```abap " 옛 방식 READ TABLE lt_users INTO DATA(ls_user) WITH KEY id = '100'. IF sy-subrc = 0. " ... ENDIF. " 신문법 (7.40) IF line_exists( lt_users[ id = '100' ] ). DATA(ls_user) = lt_users[ id = '100' ]. ENDIF. ``` 주의가 두 가지 있다. 첫째, `lt_users[ ... ]`는 못 찾으면 예외(`CX_SY_ITAB_LINE_NOT_FOUND`)를 던지니 `line_exists( )`로 감싸거나 `TRY`로 잡아야 한다. 둘째, `line_exists( )`로 확인하고 다시 `lt_users[ ... ]`로 읽으면 **같은 테이블을 두 번 검색**(double read)하는 셈이다. 성능이 중요한 루프 안이라면 한 번에 읽고 `sy-subrc`로 판단하는 쪽이 낫다. ```abap " 한 번만 검색 — ASSIGN + sy-subrc (예외도 안 던짐) ASSIGN lt_users[ id = '100' ] TO FIELD-SYMBOL(<user>). IF sy-subrc = 0. " <user> 사용 ENDIF. ``` ## 4. COND / SWITCH — IF·CASE를 식으로 값을 정하는 `IF`/`CASE`는 표현식으로 바꾸면 변수 선언과 분기가 한 줄로 합쳐진다. ```abap " 옛 방식 DATA lv_msg TYPE string. IF sy-subrc = 0. lv_msg = '성공'. ELSE. lv_msg = '실패'. ENDIF. " 신문법 (7.40 SP05) DATA(lv_msg) = COND string( WHEN sy-subrc = 0 THEN '성공' ELSE '실패' ). " CASE → SWITCH DATA(lv_label) = SWITCH string( lv_type WHEN 'A' THEN '자산' WHEN 'L' THEN '부채' ELSE '기타' ). ``` ## 5. FOR / REDUCE / FILTER — 테이블 변환·집계·필터 `LOOP`을 돌며 다른 테이블을 만들거나 합계를 내던 코드를 한 줄로. 7.40 SP08의 핵심이다. ```abap " 옛 방식 — 변환 DATA lt_names TYPE TABLE OF string. LOOP AT lt_users INTO DATA(ls). APPEND ls-name TO lt_names. ENDLOOP. " 신문법 — FOR DATA(lt_names) = VALUE string_table( FOR u IN lt_users ( u-name ) ). " 집계 — REDUCE DATA(lv_sum) = REDUCE i( INIT s = 0 FOR n IN lt_numbers NEXT s = s + n ). " 필터 — FILTER (정렬/해시 테이블 + 키 필요) DATA(lt_active) = FILTER #( lt_users WHERE status = 'A' ). ``` `FILTER`는 아무 표준 테이블에나 되는 게 아니라, 필터 키가 정렬키/해시키로 잡힌 테이블이 필요하다. 안 되면 그냥 `FOR ... WHERE`로 푸는 게 편하다. ## 6. 문자열 템플릿 — CONCATENATE 대체 `CONCATENATE ... SEPARATED BY`를 `|...{ }...|` 하나로. 포맷팅 옵션도 강력하다. ```abap " 옛 방식 DATA lv_text TYPE string. CONCATENATE '안녕' lv_name '님' INTO lv_text SEPARATED BY space. " 신문법 DATA(lv_text) = |안녕 { lv_name } 님|. " 포맷팅 — 숫자/날짜 DATA(lv_amt) = |금액: { lv_price NUMBER = '1,234.56' }|. DATA(lv_when) = |{ sy-datum DATE = USER } { sy-uzeit TIME = USER }|. ``` ## 7. CORRESPONDING — MOVE-CORRESPONDING의 표현식판 ```abap " 옛 방식 MOVE-CORRESPONDING ls_source TO ls_target. " 신문법 (7.40) — 매핑·BASE 가능 DATA(ls_target) = CORRESPONDING ty_target( ls_source ). DATA(ls_t2) = CORRESPONDING ty_target( ls_source MAPPING new_id = old_id ). ``` ## 한 가지만 기억하자 신문법은 "짧게 쓰려고"가 아니라 "의도가 더 잘 드러나게"가 목적이다. 다만 `VALUE`·`REDUCE`를 너무 깊게 중첩하면 오히려 한 줄이 암호가 된다. *짧음*보다 *읽힘*이 먼저다 — 이 균형 감각은 [Clean ABAP](/education/clean-abap-essentials)에서 더 다룬다. 모던 ABAP의 다음 단계인 CDS·RAP로 가면 이 표현식 문법이 곳곳에서 쓰이니, 여기서 손에 익혀두면 좋다. ## 출처 - SAP 공식 ABAP Keyword Documentation — Constructor Expressions / Inline Declarations / News for 7.40 SP08: [help.sap.com](https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abennews-740_sp08-expressions.htm) - SAP-samples **abap-cheat-sheets** (오픈소스, 실행 가능 예제): [github.com/SAP-samples/abap-cheat-sheets](https://github.com/SAP-samples/abap-cheat-sheets) - Horst Keller, *ABAP News for Release 7.40* (생성자 연산자 시리즈): SAP Community 심화 참고: *Complete ABAP*, *Clean ABAP* (SAP PRESS)