목차
1. # 이해하기
# 기호는 VALUE, COND, REDUCE와 같은 표현식 연산자와 함께 사용될 때, 해당 타입의 기본값이나, 컨텍스트에서 유추 가능한 타입으로 자동 결정되어야 함을 나타냅니다.
이는 ABAP 7.40 이후에 도입된 모던 ABAP 문법의 일부로, 코드를 더 간결하고 가독성 있게 만드는 데 도움을 줍니다.
각 연산자와 # 기호의 사용 예를 자세히 살펴보겠습니다.
2. 예제
DATA : LT_SFLIGHT TYPE TABLE OF SFLIGHT,
LS_SFLIGHT TYPE SFLIGHT,
LT_SCARR TYPE TABLE OF SCARR,
LS_SCARR TYPE SCARR.
LS_SCARR = CORRESPONDING #( LT_SFLIGHT[ 1 ] ).
LS_SCARR 구조체는 위에서 이미 선언되어있는 변수이기 때문에 타입을 명시하지 않고 #으로 생략이 가능합니다.
여기서 #은 SCARR 타입이라고 추론이 가능합니다.
LS_SCARR = CORRESPONDING SCARR( LT_SFLIGHT[ 1 ] ).
위와같이 #자리에 타입을 명시해도 상관없습니다.
LS_SCARR = CORRESPONDING SFLIGHT( LT_SFLIGHT[ 1 ] ). "오류
그러나 잘못된 타입을 사용하게 되면 에러가 발생합니다.
DATA(LS_ITAB) = CORRESPONDING #( LT_SFLIGHT[ 1 ] ). "오류
위 로직은 LS_ITAB을 선언하지 않았기 때문에 #을 사용하지 못하고 타입을 명시해줘야 합니다.
DATA(LS_ITAB) = CORRESPONDING SCARR( LT_SFLIGHT[ 1 ] ).
위와같이 타입을 명시하면 LS_ITAB을 Inline으로 선언하여 사용이 가능합니다.
LS_SFLIGHT = VALUE #( CARRID = 'LH' ).
LS_SFLIGHT = VALUE SCARR( CARRID = 'LH' ). "오류
VALUE 연산자를 사용할때도 마찬가지 입니다.
LS_SFLIGHT는 타입선언이 된 변수이기 때문에 #을 사용해도 무방합니다.
TARGET변수인 LS_SFLIGHT와 다른 타입을 사용하면 오류가 납니다.
LS_SFLIGHT = VALUE #( LT_SFLIGHT[ 1 ] ).
VALUE 연산자는 필드를 지정해서 값을 반영한다고 했지만 TARGET변수와 SOURCE변수의 구조가 동일할때는 위 예제와 같이 필드지정없이 모든 값을 반영할수 있다고 했습니다.
LS_SFLIGHT = VALUE SCARR( LT_SFLIGHT[ 1 ] ). "오류
LS_SCARR = VALUE #( LT_SFLIGHT[ 1 ] ). "오류
첫번째처럼 예시를 보면 TARGET변수와 SOURCE변수의 타입은 동일하지만 VAULE 연산자 다음 타입지정을 잘못하면 에러가 납니다.
두번째 예시는 VALUE 연산자를 사용할때 TARGET변수와 SOURCE변수의 타입이 다르면 필드 전체를 대입할 수 없습니다.
이 경우에는 CORRESPONDING 연산자를 사용해야 합니다.
DATA(LS_ITAB4) = VALUE #( LT_SFLIGHT[ 1 ] ).
TARGET변수의 타입이 지정이 안되어 있으면 VALUE 연산자를 사용할 때 타입을 지정해야 된다고 했었습니다.
그런데 위 예제는 타입을 생략했는데도 에러가 나지 않습니다.
이전 예제에서 VALUE 연산자를 사용할때 TARGET변수와 SOURCE변수의 구조가 동일하면 필드 지정없이 모든값을 반영할수 있다고 했었습니다.
이 경우도 그에 해당한다고 생각하시면 됩니다.
구조가 동일해야지만 되기때문에 #을 SFLIGHT의 구조로 추론하고 값을 대입하게 됩니다.
DATA(LS_ITAB6) = VALUE SCARR( LT_SFLIGHT[ 1 ] ). "오류
시스템이 추론하게끔 #을 사용하면 문제가 없는데 굳이 엉뚱한 타입을 지정하면 오류가 납니다.
3. 장점
이러한 #의 사용은 타입 추론(Type Inference) 기능을 활용하여, 개발자가 타입을 명시적으로 지정하는 번거로움을 줄이고, 코드의 가독성을 향상시키기 위한 것입니다.
컨텍스트에 따라 타입이 자동으로 결정되기 때문에, 개발자는 보다 집중하여 로직 구현에만 주의를 기울일 수 있습니다.