ABAP

[ABAP] 모던 문법 실전 — FILTER, REDUCE, VALUE로 코드 줄이기

▶ YouTube에서 보기

[ABAP] 모던 문법 실전 — FILTER, REDUCE, VALUE로 코드 줄이기

Moderator · 2026. 4. 25. · 조회 6

[ABAP] 모던 문법 실전 — FILTER, REDUCE, VALUE로 코드 줄이기

Moderator · 2026. 4. 25. · 조회 6

[ABAP] 모던 문법 실전 — FILTER, REDUCE, VALUE로 코드 줄이기

개요

ABAP 7.40 이후 도입된 VALUE, FILTER, REDUCE 연산자는 Internal Table 처리를 혁신적으로 간결하게 만들어줍니다. 기존에 10줄 이상 걸리던 테이블 초기화, 필터링, 집계를 1~3줄로 줄일 수 있습니다. S/4HANA 및 BTP ABAP Cloud 환경에서 권장되는 모던 문법입니다.

이 글에서 다루는 것

핵심 개념

  • VALUE #( ) — Internal Table이나 구조체를 인라인으로 초기화합니다. APPEND를 반복할 필요 없이 한 번에 여러 행을 삽입합니다.
  • FILTER #( ) — Sorted/Hashed 테이블에서 키 기반 필터링을 수행합니다. LOOP + IF + APPEND 패턴을 한 줄로 대체합니다. 주의: Standard 테이블에는 사용할 수 없으며, USING KEY를 지정해야 합니다.
  • REDUCE — 테이블의 값을 반복하며 하나의 결과로 축약합니다. 합계, 카운트, 문자열 연결 등에 활용됩니다.

코드 예제

1. VALUE — 테이블 한 줄 초기화

* 클래식 방식 (7줄)
DATA: lt_cities TYPE TABLE OF string.
APPEND 'Seoul' TO lt_cities.
APPEND 'Tokyo' TO lt_cities.
APPEND 'Berlin' TO lt_cities.

* 모던 방식 (1줄)
DATA(lt_cities) = VALUE string_table( ( `Seoul` ) ( `Tokyo` ) ( `Berlin` ) ).

* 구조체 테이블 초기화
TYPES: BEGIN OF ty_flight,
         carrid TYPE string,
         connid TYPE string,
         price  TYPE p DECIMALS 2,
       END OF ty_flight.

DATA(lt_flights) = VALUE ty_flight_tab(
  ( carrid = 'LH' connid = '400' price = '850.00' )
  ( carrid = 'AA' connid = '017' price = '650.00' )
  ( carrid = 'LH' connid = '401' price = '920.00' )
).

2. FILTER — 키 기반 필터링

* Sorted 테이블 + USING KEY로 필터링
TYPES ty_flight_sorted TYPE SORTED TABLE OF ty_flight
  WITH NON-UNIQUE KEY carrid.

DATA(lt_sorted) = CORRESPONDING ty_flight_sorted( lt_flights ).

* LH 항공만 필터링 (한 줄!)
DATA(lt_lh_flights) = FILTER #( lt_sorted
  USING KEY primary_key
  WHERE carrid = 'LH' ).

* 결과: LH 400, LH 401 두 건만 남음
* 주의: Standard Table에는 FILTER 사용 불가!

3. REDUCE — 합계 계산

* 전체 항공편 가격 합계
DATA(lv_total) = REDUCE p DECIMALS 2(
  INIT sum = CONV p DECIMALS 2( 0 )
  FOR flight IN lt_flights
  NEXT sum = sum + flight-price
).
* 결과: 2420.00

* 문자열 연결 (쉼표 구분)
DATA(lv_carriers) = REDUCE string(
  INIT result = ``
  FOR flight IN lt_flights
  NEXT result = COND #(
    WHEN result IS INITIAL THEN flight-carrid
    ELSE result && `, ` && flight-carrid )
).
* 결과: "LH, AA, LH"

* 조건부 카운트
DATA(lv_expensive) = REDUCE i(
  INIT count = 0
  FOR fl IN lt_flights
  NEXT count = COND #(
    WHEN fl-price > 800 THEN count + 1
    ELSE count )
).
* 결과: 2 (850, 920)

실무 팁

  • FILTER 제한 — Standard Table에는 사용 불가합니다. Sorted 또는 Hashed Table로 변환하거나, FOR ... IN ... WHERE 구문을 대안으로 사용하세요: VALUE #( FOR fl IN lt_flights WHERE ( carrid = 'LH' ) ( fl ) )
  • 성능 — FILTER는 키 기반이라 LOOP+IF보다 일반적으로 빠릅니다. 대용량(10만건+) 테이블에서는 Hashed Table + FILTER 조합이 권장됩니다.
  • 가독성 — REDUCE가 복잡해지면 오히려 가독성이 떨어집니다. 3단계 이상의 중첩은 별도 메서드로 분리하세요.

자세한 내용은 본문에서

더 읽어볼 자료


⚠️ 비공식 콘텐츠 안내

본 게시글은 btpstacks.com의 독립 학습 콘텐츠이며 SAP SE와 무관합니다. 공식 문서는 help.sap.com을 참고하세요.

SAP, ABAP, SAP BTP, SAPUI5, SAP Fiori는 독일 및 기타 국가에서 SAP SE의 상표 또는 등록상표입니다.

댓글 0

아직 댓글이 없습니다.