본문 바로가기
🧑‍💼 SAP/ABAP

[SAP ABAP] 서브루틴(Subroutine) 파라미터(Call by Value, Call by Reference, Call by Value and Result)

by Jay Din 2023. 8. 18.
728x90
반응형

파라미터(Parameter)

파라미터(Parameter)는 Subroutine을 호출하는 구문과 호출받는 구문 사이에 주고받는 값을 의미합니다.

Subroutine 내에서 파라미터는 DATA 구문으로 정의하는 일반적인 Local변수와 같습니다.

Subroutine을 호출할 때 사용되는 파라미터를 Actual Parameter

Subroutine에서 사용되는 파라미터를 Formal Parameter라 정의합니다.

 

PERFORM의 USING, CHANGING 구문을 사용하여 파라미터를 선언하며 Subroutine과 그 순서를 같게 지정해야 합니다.

파라미터는 ABAP의 모든 기본 Data Type, Field Symbol, Internal Table 등을 사용할 수 있습니다.

 

파라미터 전달 방법

Subroutine은 Using과 Changing 구문으로 파라미터를 주고받게 되는데, 3가지 유형으로 분류됩니다.

Call by Value 넘겨주는 변수(Actual Parameter)받는 변수(Formal Parameter)물리적으로 다른 메모리 영역을 가지고 있다.
Call by Reference 물리적으로 같은 메모리 영역을 공유하여 넘겨주며 값은 주소이다.
Call by Value and Result 변수의 값을 넘겨주고 받는 구문에서 작업을 성공적으로 수행하였을 경우 변경된 값을 되돌려 준다. 물리적으로는 다른 영역을 사용한다.

 

Call by Value란 ?

Call by Value는 넘겨주는 변수(Actual Parameter)와 받는 변수(Formal Parameter)가 물리적으로 다른 메모리 영역을 가지고 있다.

 

Call by Value는 USING 키워드 다음에 파라미터를 사용하고, VALUE 구문으로 완성합니다.

 

FORM <subroutine> USING .. VALUE(pi)	[TYPE <t>|LIKE <f>] .

 

VALUE 구문에서 Formal Parameter는 자신의 메모리를 가집니다.

Subroutine을 호출할 때, Actual Parameter의 값은 Formal Parameter에 복사됩니다.

하지만 Formal Parameter의 값이 변경되더라도 Actual Parameter에는 영향을 미치지 않습니다.

 

Call by Value 예제

REPORT ZABAP001 .

DATA : gv_val TYPE c LENGTH 20 VALUE 'Call by value test'.

PERFORM call_by_value USING gv_val.

FORM call_by_value USING VALUE(p_val).
  WRITE p_val.
  ENDFORM.
  
* 결과
* Call by value test

 

FORM 구문에서 USING과 VALUE키워드를 같이 사용하면 새로운 메모리에 값을 복사하여 값을 전달 받습니다.

이때 FORM 구문 내에 사용된 p_val 변수는 지역(Local) 변수입니다.

 

반응형

 

Call by Reference란?

Call by Reference는 물리적으로 같은 메모리 영역을 공유하여 넘겨주며 값은 주소이다.

CHANGING 키워드 다음에 파라미터를 사용하면, Subroutine에 전달된 파라미터 값이 변경됩니다.

FORM subroutine CHANGING ... pi [TYPE <t>|LIKE <f>] ...

 

Subroutine의 Formal Parameter는 자신의 메모리를 가지지 않습니다.

Subroutine이 호출되는 동안 Actual Parameter의 주솟값을 가지고 있을 뿐입니다.

즉, Subroutine을 호출한 프로그램의 메모리(동일한 변수 이름)에서 작업하게 됩니다.

 

Call by Reference 예제

DATA : GV_VAL TYPE C LENGTH 30 VALUE 'Call by reference Test'.

WRITE / GV_VAL.

PERFORM CALL_BY_REF CHANGING GV_VAL.

WRITE / GV_VAL.

FORM CALL_BY_REF CHANGING P_VAL.
  P_VAL = 'Value is changed'.
ENDFORM.

* 실행결과
* Call by reference Test
* Value is changed

첫 번째 WRITE 구문은 gv_val 변수를 선언할 때 지정한 값이 출력되고,

두 번째 WRITE 구문은 FORM 구문에서 변경한 문자열이 출력됩니다.

 

VALUE 구문을 사용하지 않으면 USING 구문과 CHANGING 구문을 모두 Call By Reference를 이용하게 됩니다. 때문에 CHANGING을 USING으로 변경해도 같은 결과가 출력됩니다.

또한 PERFORM 구문에서는 USING을 사용하고, FORM에서는 CHANGING을 사용해도 에러가 발생하지 않습니다.

 

정리하면

FORM 구문 내에서 VALUE 구문을 사용하지 않으면 USING과 CHANGING 구문의 기능은 같습니다.

단지 가독성 차원에서 '사용', '변경' 한다는 것을 명시적으로 표현하기 위해 구분한 것입니다.

USING 데이터를 전달한다는 의미를 가짐
CHANGING 데이터를 전달하고 변경한다는 의미를 가짐

 

Actual Parameter의 값이 Subroutine 내에서 자동으로 변경되는 것을 피하려면 USING과 VALUE 구문을 함께 사용해야 합니다.

 

Call by Value and Result

Call by Value and Result는 변수의 값을 넘겨주고 받는 구문에서 작업을 성공적으로 수행하였을 경우 변경된 값을 되돌려 준다. 물리적으로는 다른 영역을 사용한다.

 

CHANGING 키워드 다음에 파라미터를 사용하고, VALUE 구문으로 완성하면 됩니다.

FORM <subroutine> CHANGING..VALUE(pi)	[TYPE <t>|LIKE <f>].

 

USING 구문과 VALUE 구문이 함께 사용되면 Subroutine 내에서 Actual Parameter 값을 변경할 수 없으나(Call by value),

CHANGING 구문과 VALUE 구문이 함께 사용되면 Subroutine이 정상적으로 종료될 경우 Actual Parameter값이 변경됩니다.

즉, CHANGING구문은 항상 VALUE 구문과 함께 사용하는 것이 바람직합니다.

 

반응형

 

Call by Value and Result 예제

정수 타입 변수 3개를 선언하고, FORM 구문 내에서 더하기를 수행하고 출력하는 프로그램

REPORT ZABAP001 .

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 : / '결과는 ', GV_SUM.

FORM SUM_DATA USING VALUE(P_VAL1)
                    VALUE(P_VAL2)
           CHANGING VALUE(P_SUM).
  P_SUM = P_VAL1 + P_VAL2.
ENDFORM.

 

 


참고

[도서] Easy ABAP 2.0 - 김성준

728x90
반응형