본문 바로가기

Programming/ABAP

Call by Value /Call by Reference /Call by Value and Reference

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(김성준)

728x90

'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