본문 바로가기

ABAP 프로그래밍 개념/Modulazation Technique

2-5. Modularization Techniques - Program Structure : Inline Declarations

SAP NetWeaver 7.4에서, SAP는 Inline Declarations을 도입하였습니다. 인라인 선언(Inline declarations)은 ABAP 문장에서 사용하기 전에 사전에 선언하는 대신 필요할 때 데이터 객체를 인라인으로 선언할 수 있도록 합니다.

대부분의 ABAP 개발자는 프로그램의 시작 부분에(보통 전역 선언 영역) Data Object을 정의하거나 Procedure의 시작점에(보통 지역 선언 영역)에서 데이터를 정의해야 된다고 생각하고, 코드 어디에서나 무작위하게 데이터 선언을 하는 것을 피하고자 합니다. 하지만 많은 개발자들은 데이터 객체가 사용되기 직전에 선언하여 해당 규칙을 무시하는데, 이는 데이터 객체가 사용되는 위치에 대해 더 많은 명확성을 제공하기 때문입니다. 다른 많은 프로그래밍 언어(PHP 등)는 사용하기 전에 데이터 객체를 선언할 필요가 없기 때문에 인라인 선언이 필요하지 않습니다. Inline Declarations이 도입되면서, 이제 프로그램이나 Procedure의 맨 위에서 선언하는 대신 필요한 시점에 데이터 객체를 선언할 수 있는 유연성이 생겼습니다.

Inline Declarations도 전역적인 관점(Global Data로서 사용되는 것)으로 사용되는 것이 가능하기만, Inline Declarations을 Globla Data Object로서 사용하는 것은 혼란을 피하기 위해 권장되지 않습니다. SAP는 Inline Declarations을 오직 Procedure안에서 사용하여 지역적인 Data Object 관점에서 사용하는 것을 권장합니다.

Inline Declarations은 수 백줄로 구성된 긴 소스코드의 Procedure에서 유용한데, 긴 소스코드의 Procedure에서는 새로운 Data Object를 정의할 때마다 해당 Procedure의 시작점에 올라가서 선언하는 것은 매우 짜증나기 때문입니다. Inline Declarations은 데이터 객체가 기록되는 작성 위치(writer position)에서 예상되는 ABAP 문의 피연산자(Operands) 위치에서 키워드 DATA(..)를 사용하여 작성됩니다.

Inline Declarations이 ABAP 코딩에 어떤 영향을 미쳤는지 더 잘 이해하기 위해, 이전 구문과 비교한 예제를 사용하여 인라인 선언을 사용하는 방법을 살펴보겠습니다.


Assigning Values to Data Objects


SAP NetWeaver 7.4 시스템 이전에서는, Data Object에 값을 할당하기 위해서, Data Object를 정의하고, 값을 할당했어야합니다. 

DATA lv_variable TYPE string.
lv_variable = 'ABAP'.

SAP NetWeaver 7.4 이후로는, 앞선 두줄의 코드를 한줄로 줄일 수 있습니다.

DATA(lv_variable) = 'ABAP'.

볼 수 있듯이, Inline Declarations은 코드의 라인 수를 절반 이상 줄여줍니다. DATA(..) 구문을 사용하였을 때, Data Object는 코드가 코드가 컴파일될 때 자동으로 생성되며, 실행 중인 시간에 해당 문장이 실행되는지 여부와는 상관없이 생성됩니다.


Using Inline Declarations with Table Work Areas


아래 구문 처럼 Table Work Area을 사용할 때도 Inline Declarations을 사용할 수 있습니다.

DATA: lt_spfli TYPE STANDARD TABLE OF SPFLI,
      ls_spfli LIKE LINE OF lt_spfli.
      
LOOP AT lt_spfli INTO ls_spfli.
ENDLOOP.

 

이전에는 보통 위와 같이 사용했지만, 7.4 이후로는 아래와 같이 선언하여 사용가능합니다.

DATA: lt_spfli TYPE STANDARD TABLE OF SPFLI.
LOOP AT lt_spfli INTO DATA(ls_spfli).
ENDLOOP.

Inline Declarations는 READ 구문에서 Work Area를 사용할 때도 마찬가지로 쓸 수 있습니다.

READ TABLE lt_spfli INTO DATA(ls_spfli) INDEX 1.

Avoiding Helper Variables


Inline Declarations은 미리 Helper Variables(소위 도우미 변수)를 정의하는 것을 피하고자 할 때 유용합니다. 예를 들어, Internal Table의 Row 수를 찾으려고 하기 위해서, 우리는 DESCRIBE TABLE 구문을 Helper Variables 과 함께 사용합니다. 7.4 이전에는 아래와 같이 구문을 사용하였습니다.

DATA lv_lines TYPE i. "helper variable"
DESCRIBE TABLE lt_spfli LINES lv_lines.

7.4 이후에는 lv_lines를 위와 같이 선언하지않고 Inline Declaration을 이용하여 선언할 수 있습니다.

DESCRIBE TABLE lt_spfli LINES DATA(lv_lines).

Declaring Actual Parameters


Inline Declaration이 매우 유용한 다른 영역은 Actual Parameter의 선언 입니다. 예를 들어, 클래스의 Method를 호출할 때, Actual Parameter는 formal Parameter와 Type이 매칭되어야 합니다. Actual Parameter가 Formal Parameter와 같은 Type 인것을 보증하기 위하여, 우리는 Method 시그니처를 확인하고, 실제 매개변수를 형식 매개변수와 동일한 타입으로 정의합니다. 각 Actual Parameter의 시그니처를 확인하려면 탐색하는 것이 귀찮은 업무 입니다. 게다가, Formal Parameter의 타입이 변경될 때마다 프로그램에서 Actual Parameter의 타입도 변경되어야 합니다. 다음과 같이 Inline Declaration을 사용하면 이러한 모든 문제를 피할 수 있습니다.  

래 코드는 7.4 버젼 이전의 코드입니다.

DATA: lv_a1 TYPE string,
      lv_a2 TYPE string.
      
oref->meth( IMPORTING fp1 = lv_a1
                      fp2 = lv_a1 ).

다음은, 7.4 이후로부터 사용가능한 코드입니다.

oref->meth( IMPORTING fp1 = DATA(lv_a1)
                      fp2 = DATA(lv_a1) ).

보다시피, Inline Declaration은 작성자 위치에서 어떤 문장에서든 사용될 수 있습니다. 올바르게 사용하면, 인라인 선언은 코드를 더 간결하고 이해하기 쉽게 만들어 줄 수 있습니다. 이전에 언급한 대로, Inline Declaration은 Procedure 내에서만 사용하여 Procedure의 로컬 데이터 범위를 제한해야 합니다.

반응형