1. subroutine

(FORM ... ENDFORM.)프로시저처럼 동작하는 코드 블록

 

2. CALL BY VALUE vs CALL BY REFERENCE 

구분 설명
CALL BY VALUE 값만 복사해서 넘김 → 원본에 영향 없음
CALL BY REFERENCE 주소를 넘김원본이 직접 변경됨
FORM my_form USING VALUE(p_val)   " Call by Value
                        p_ref.    " Call by Reference
  • VALUE(p_val) : 값 복사 → 복사본만 바뀜
  • p_ref         : 참조로 전달 → 원본도 바뀜

 

  1. VALUE(...)Call by Value (값에 의한 호출)
  2. USINGCall by Reference (참조에 의한 호출, 읽기 전용의 의미로 자주 사용됨)
  3. CHANGINGCall by Reference (참조에 의한 호출, 값이 변경될 수 있음)

 


Call by value

DATA: gv_val TYPE i VALUE 10,
      gv_ref TYPE i VALUE 10.

PERFORM test_form USING VALUE(gv_val) gv_ref.

WRITE: / 'gv_val:', gv_val,  " 그대로 10
       / 'gv_ref:', gv_ref.  " 바뀜

 

문법 호출 방식
FORM myform USING var. Call by Reference var주소를 넘김 (원본이 바뀜)
FORM myform USING VALUE(var). Call by Value var값만 복사해서 넘김 (원본 안 바뀜)

- call by value와 reference 둘 다 using 키워드를 써서 헷갈렸는데, USING은 단순히 '파라미터를 넘긴다'라는 의미.

- VALUE(...)는 넘기는 방식이 '값 복사' 방식임을 명시

- 값 복사에서는 CHANGING을 못쓰는 이유 =>.changin은 원래 값이 바뀌는 것을 전제로 하는데, call by value는 복사본만 넘기기 때문

 

Call by Reference

PERFORM call_byvref USING gv_val.

FORM call_byvref CHANGING p_val.
	p_val='Value is Changed'.
ENDFORM.

 

- VALUE구문을 사용하지 않으면 USING구문과 CAANGING구문은 모두 call by ref를 이용함

=> 따라서 CHANGiNG을 USING으로 변경해도 같은 결과가 나오고, Perform에서 using사용, form에서 changing을 사용해도 에러가 따로 발생하지 않는다.

- 두 구문의 차이는 가독성 차원일 뿐임

- using : 데이터를 전달한다.

- changing : 데이터를 전달하고 변경한다.

PERFORM call_byref USING gv_val.

FORM call_byvref CHANGING p_val.
	p_val = 'Value is changed'.
ENDFORM.

 

Call by Value and Result란?

**“값을 복사해서 넘기고, 끝날 때 복사한 값을 다시 돌려주는 방식”**

 

📦 1단계:  Value (값 복사)

  • 호출할 때 원래 값의 복사본이 전달
  • 그러니까 FORM 안에서 바꿔도 원래 값은 처음에는 바뀌지 않음

 

📤 2단계:  Result (결과 복사)

 

  • FORM이 끝날 때, 내부에서 바뀐 복사본 값을 원래 변수에 다시 복사해서 덮어씌움
  • 그래서 결과는 반영됨!

 

 

결과값은 위와 같다.

 

 


+ Recent posts