목차
1. FOR Operator 란?
FOR 연산자는 주로 VALUE 연산자와 함께 사용되어, 반복적인 패턴을 가진 데이터 구조의 생성과 초기화에 활용됩니다. 이 연산자를 사용하면 코드를 간결하게 유지하면서 동적으로 데이터 구조체나 내부 테이블을 초기화하고, 복잡한 데이터 변환을 보다 쉽게 처리할 수 있습니다.
아래 예제에서는 이전 LOOP을 사용한 로직을 FOR 연산자를 사용하면 어떻게 바뀌는지 비교해 보겠습니다.
2. FOR Operator 예제
예제1) 기본 사용법
[OLD]
DATA : LT_SCARR TYPE TABLE OF SCARR,
LS_SCARR TYPE SCARR,
LT_SFLIGHT TYPE TABLE OF SFLIGHT,
LS_SFLIGHT TYPE SFLIGHT.
SELECT *
FROM SFLIGHT
INTO TABLE @LT_SFLIGHT.
LOOP AT LT_SFLIGHT INTO LS_SFLIGHT.
LS_SCARR-CARRID = LS_SFLIGHT-CARRID.
LS_SCARR-CARRNAME = 'Airline Name'.
APPEND LS_SCARR TO LT_SCARR.
ENDLOOP.
[NEW]
DATA : LT_SCARR TYPE TABLE OF SCARR,
LT_SFLIGHT TYPE TABLE OF SFLIGHT.
SELECT *
FROM SFLIGHT
INTO TABLE @LT_SFLIGHT.
LT_SCARR = VALUE #( FOR WA IN LT_SFLIGHT
( CARRID = WA-CARRID
CARRNAME = 'Airline Name' ) ).
위 에제는 기존의 LOOP구문을 FOR 연산자를 사용했을때의 예제입니다.
FOR 연산자 다음에 Work Area를 지정합니다. 그리고 FOR문에 의해 순차 접근할 Internal Table을 지정하면 됩니다.
FOR문 앞쪽에 보시면 VALUE 연산자를 사용하기 때문에 필드를 지정하여 값을 입력하는걸 볼 수 있습니다.
[OLD]
DATA : LT_SCARR TYPE TABLE OF SCARR,
LS_SCARR TYPE SCARR,
LT_SFLIGHT TYPE TABLE OF SFLIGHT,
LS_SFLIGHT TYPE SFLIGHT.
SELECT *
FROM SFLIGHT
INTO TABLE @LT_SFLIGHT.
LOOP AT LT_SFLIGHT INTO LS_SFLIGHT.
MOVE-CORRESPONDING LS_SFLIGHT TO LS_SCARR.
APPEND LS_SCARR TO LT_SCARR.
ENDLOOP.
[NEW]
DATA : LT_SCARR TYPE TABLE OF SCARR,
LS_SCARR TYPE SCARR,
LT_SFLIGHT TYPE TABLE OF SFLIGHT,
LS_SFLIGHT TYPE SFLIGHT.
SELECT *
FROM SFLIGHT
INTO TABLE @LT_SFLIGHT.
LT_SCARR = VALUE #( FOR WA IN LT_SFLIGHT
( CORRESPONDING #( WA ) ) ).
위 예제는 VALUE 연산자 안쪽에서 CORRESPONDING 연산자를 사용한 예제입니다.
VALUE 연산자는 필드를 지정해야 하지만 위 예제처럼 VALUE 연산자 안쪽에 CORRESPONDING 연산자를 사용할 수도 있습니다.
예제2) WHERE조건 사용
[OLD]
DATA : LT_SCARR TYPE TABLE OF SCARR,
LS_SCARR TYPE SCARR,
LT_SFLIGHT TYPE TABLE OF SFLIGHT,
LS_SFLIGHT TYPE SFLIGHT.
SELECT *
FROM SFLIGHT
INTO TABLE @LT_SFLIGHT.
LOOP AT LT_SFLIGHT INTO LS_SFLIGHT WHERE CARRID = 'LH'.
MOVE-CORRESPONDING LS_SFLIGHT TO LS_SCARR.
APPEND LS_SCARR TO LT_SCARR.
ENDLOOP.
[NEW]
DATA : LT_SCARR TYPE TABLE OF SCARR,
LS_SCARR TYPE SCARR,
LT_SFLIGHT TYPE TABLE OF SFLIGHT,
LS_SFLIGHT TYPE SFLIGHT.
SELECT *
FROM SFLIGHT
INTO TABLE @LT_SFLIGHT.
LT_SCARR = VALUE #( FOR WA IN LT_SFLIGHT WHERE ( CARRID = 'LH' )
( CORRESPONDING #( WA ) ) ).
FOR문에서도 WHERE조건을 사용할 수 있습니다.
예제3) NESTED LOOP
[OLD]
DATA : LT_RESULT TYPE TABLE OF SFLIGHT,
LS_RESULT TYPE SFLIGHT,
LT_SCARR TYPE TABLE OF SCARR,
LS_SCARR TYPE SCARR,
LT_SFLIGHT TYPE TABLE OF SFLIGHT,
LS_SFLIGHT TYPE SFLIGHT.
SELECT * INTO TABLE LT_SCARR
FROM SCARR.
SELECT * INTO TABLE LT_SFLIGHT
FROM SFLIGHT.
LOOP AT LT_SCARR INTO LS_SCARR.
LOOP AT LT_SFLIGHT INTO LS_SFLIGHT
WHERE CARRID = LS_SCARR-CARRID.
MOVE-CORRESPONDING LS_SFLIGHT TO LS_RESULT.
APPEND LS_RESULT TO LT_RESULT.
ENDLOOP.
ENDLOOP.
[NEW]
DATA : LT_RESULT TYPE TABLE OF SFLIGHT,
LT_SCARR TYPE TABLE OF SCARR,
LT_SFLIGHT TYPE TABLE OF SFLIGHT.
SELECT * INTO TABLE @LT_SCARR
FROM SCARR.
SELECT * INTO TABLE @LT_SFLIGHT
FROM SFLIGHT.
LT_RESULT = VALUE #( FOR LS_SCARR IN LT_SCARR
FOR LS_SFLIGHT IN LT_SFLIGHT WHERE ( CARRID = LS_SCARR-CARRID )
( CORRESPONDING #( LS_SFLIGHT ) ) ).
FOR문을 이용해 중첩 LOOP도 가능합니다.
LOOP문과 비교하면서 FOR문을 보시면 쉽게 이해가 되실거라 생각됩니다.
3. FOR Operator 장점
코드 간결성: FOR 연산자를 사용하면 반복적인 데이터 생성 패턴을 한 줄의 코드로 간결하게 표현할 수 있습니다.
유연성: 동적 데이터 구조 생성 시 FOR 연산자를 사용하면, 실행 시점에 데이터 구조의 크기나 형태를 결정할 수 있는 유연성을 제공합니다.
가독성 및 유지보수성 향상: 코드의 목적이 명확해지며, 반복 로직이 간결하게 표현되어 코드의 가독성과 유지보수성이 향상됩니다.