Call by Value | 넘겨주는 변수(Actual Parameter)와 받는 변수(Formal Parameter)가 물리적으로 다른 메모리 영역을 가지고 있다. |
Call by Reference | 물리적으로 같은 메모리 영역을 공유하여 넘겨주며 값은 주소이다. |
Call by Value and Result | 변수의 값을 넘겨주고 받는 구문에서 작업을 성공적으로 수행하였을 경우 변경된 값을 되돌려 준다. 물리적으로는 다른 영역을 사용한다. |
Call by Value
FORM subr USING .. VALUE(pi) [TYPE <t> | LIKE <f>].
USING 키워드 다음 파라미터를 작성하고, VALUE 구문을 사용한다.
VALUE 구문에서 Formal Parameter 는 자신의 메모리를 가진다. Subroutine 을 호출할 때, Actual Parameter 의 값은 Formal Parameter 에 복사된다. 하지만, Formal Parameter 의 값이 변경되더라도 Actual Parameter 에는 영향을 미치지 않는다.
REPORT ZTEST.
DATA : gv_val TYPE c LENGTH 20 VALUE 'Call by value TEST'.
PERFORM call_byvalue USING gv_val.
FORM call_byvalue USING VALUE(p_val).
WRITE p_val.
ENDFORM.
* output : Call by value TEST
→ FORM 구문에서 USING 과 VALUE 키워드를 같이 사용하면 새로운 메모리에 값을 복사하여 값을 전달받는다. 이때 FORM 구문 내에 사용된 p_val 변수는 지역변수이다.
Call by Reference
FORM subr CHANGING.. pi [TYPE <t> | LIKE <f>]..
CHANGING 키워드 다음 파라미터를 작성하면, Subroutine 에 전달된 파라미터 값이 변경된다.
Subroutine 의 Formal Parameter 는 자신의 메모리를 가지지 않는다. Subroutine 이 호출되는 동안 Actual Parameter 의 주솟값을 가지고 있을 뿐이다. 즉, Subroutine 을 호출한 프로그램의 메모리(동일한 변수 이름)에서 작업하게 된다.
REPORT ZTEST.
DATA : gv_val TYPE c LENGTH 30 VALUE 'Call by reference TEST'.
WRITE / gv_val.
PERFORM call_byref CHANGING gv_val.
WRITE / gv_val.
FORM call_byref CHANGING p_val.
p_val = 'Value is changed'
ENDFORM.
* output :
Call by reference TEST
Value is changed
→ 첫 번째 WRITE 문은 gv_val 을 선언할 때 지정한 VALUE 값이 출력되고, 두 번째 WRITE 구문은 FORM 구문에서 변경한 문자열이 출력된다.
VALUE 구문을 사용하지 않으면, USING 구문과 CHANGING 구문은 모두 Call by Reference 를 이용하게 된다. 위 코드에서 CHANGING 을 USING 으로 변경해도 같은 결과가 출력된다.
PERFORM call_byref USING gv_val.
FORM call_byref USING p_val.
p_val = 'Value is changed'
ENDFORM.
PERFORM 구문에서는 USING 을 사용하고, FORM 에서는 CHANGING 을 사용해도 에러가 발생하지 않는다.
PERFORM call_byref USING gv_val.
FORM call_byref CHANGING p_val.
p_val = 'Value is changed'
ENDFORM.
즉, FORM 구문 내에서 VALUE 구문을 사용하지 않으면 USING 과 CHANGING 구문의 기능은 같다. 단지 가독성 차원에서 ‘사용’, ‘변경’한다는 것을 명시적으로 표현하기 위해 구분한 것이다.
USING 은 데이터를 전달하고, CHANGING 은 데이터를 전달하고 변경한다는 의미를 가진다.
Actual Parameter 의 값이 Subroutine 내에서 자동으로 변경되는 것을 피하려면 USING 과 VALUE 구문을 함께 사용해야 한다.
Call by Value and Result
FORM subr CHANGING .. VALUE(pi) [TYPE <t> | LIKE <f>].
USING 과 VALUE 가 함께 사용되면 Subroutine 내에서 Actual Parameter 값을 변경할 수 없으나(Call by value), CHANGING 구문과 VALUE 구문이 함께 사용되면 Subroutine 이 정상적으로 종료될 경우 Actual Parameter 값이 변경된다.
→ CHANGING 구문은 항상 VALUE 구문과 함께 사용 하는 것이 바람직하다.
REPORT ZTEST_00.
DATA : gv_val1 TYPE i VALUE 2,
gv_val2 TYPE i VALUE 3,
gv_sum TYPE i.
PERFORM sum_data USING gv_val1 gv_val2 CHANGING gv_sum.
WRITE : /'Result is : ', gv_sum.
FORM sum_data USING value(p_val1)
value(p_val2)
CHANGING value(p_sum).
p_sum = p_val1 + p_val2.
ENDFORM.
* output : Result is : 5
참고
: EASY ABAP 2.0(김성준)
'Programming > ABAP' 카테고리의 다른 글
Internal Table 생성하기 (0) | 2023.08.02 |
---|---|
Internal Table, Work area (0) | 2023.08.01 |
Modularization - Function Module/ Function Groups (0) | 2023.07.28 |
Modularization - Subroutine (0) | 2023.07.27 |
ABAP Data Dictionary - Data element/ Domains (0) | 2023.07.26 |