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 : 참조로 전달 → 원본도 바뀜
- VALUE(...) → Call by Value (값에 의한 호출)
- USING → Call by Reference (참조에 의한 호출, 읽기 전용의 의미로 자주 사용됨)
- CHANGING → Call 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이 끝날 때, 내부에서 바뀐 복사본 값을 원래 변수에 다시 복사해서 덮어씌움
- 그래서 결과는 반영됨!
결과값은 위와 같다.
'SAP' 카테고리의 다른 글
easy abap 18. subroutine (0) | 2025.05.10 |
---|---|
easy abap 17. 파라미터 타입정의, 구조체, 인터널테이블, tables구문 (0) | 2025.05.10 |
easy abap 15. 효율적인 SQL 구문 작성 (0) | 2025.05.09 |
easy abap 14. modify (0) | 2025.05.09 |
easy abap 13. Delete (0) | 2025.05.09 |