다른 프로그램에도 있는 개념
Call by value
Call by Reference
그런던 ABAP에서 이를 보다 확장시킨 개념으로 사용하고 있습니다.
이 기본개념부터 차근차근 이해하고 있어야 내가 원하는 서브루틴을 만들고 남이만든것을 볼수 있습니다.
사견이 있어 객관적이지 못함점을 이해해 주시기 바랍니다.(죄송합니다. ㅠㅠ)
Sub-Routine 정리
용어설명 |
Actual Parameter |
Main 프로그램 입장에서 ( 서브루티 호출시 나의 자원을 넘겨주니까/ 그건 현실적 매개변수이다) |
Formal Parameter |
Main 프로그램 입장에서 ( 서브루틴에 이미 선언 명시되어있어 그렇게 사용해야만 하는 매개변수이다) |
Input Parameter |
sub 프로그램 입장에서 ( Using명령에 의해 변경될필요가 없는 매개변수를 말한다.) |
Output Parameter |
sub 프로그램 입장에서 ( Changing명령에 의해 변경될필요가 있는 매개변수를 말한다.) |
그럼 이 용어를 이해 했으면 이런말을 할 수 있어야 한다. Subroutine구성시 Formal Parameter의 구성원들을 먼저 생각해 놓아야 한다. 그리고 Formal Parameter구성원이 결정되었으면 sub프로그램내에서 가공을 어떻게 할지에 따라서 Input Parameter와 Output Parameter를 구분하여야 한다. 메인프로그램에서는 서브루틴 호출시 Formal parameter에 맞추워 Actual Parmeter를 넘겨주어야한다 |
Parameter 구성방법 (Interface(전달방법)에 따른 구성) |
Call by Value |
Actual, Formal Parameter가 각자 다른 변수영역을 사용한다.
(명령어 Value에 주목하라) |
Call by Reference |
Actual Parameter의 메모리번지를 공유하여 같은곳을 바라본다.
(생략시 Default로 사용됨) |
Call by Value and Result |
Actual, Formal Parameter가 각자 다른 변수영역을 사용한다
( 서브루틴 정상종료후 Actual을 변경한다) |
FORM sub1 USING p1 TYPE c VALUE(p2) TYPE c VALUE(p3) TYPE p
CHANGING p4 TYPE c VALUE(p5) TYPE c.
CHECK sy-subrc = 0. EXIT. ENDFORM.
|
Call by Reference ReadOnly( Actual의 메모리주소를 공유해서 사용한다 ) Call by value ( Actual, formal 각자 변수메모리 영역을 따로 관리한다) Call by value ( Actual, formal 각자 변수메모리 영역을 따로 관리한다)
p의 decimal 은 actual에서 상속받는다 Call by Reference ( Actual의 메모리주소를 공유해서 사용한다) Call by Value and Result( Actual, formal 각자 변수메모리 영역을 따로 관리한후
성공유무에 따라 호출자변경) 참이면 서브루틴을 계속진행하다 서브루틴을 탈출한다
|
Parameter 구성방법 (매개변수의 유형에 따른 구성)/ 사용방법은 아래의 샘플코드를 참조하도록 한다 |
FORM sub1 TABLES p5_itab LIKE a3_itab[] "[itab(header line)] / 구조를 알고있음 CHANGING p1_stru TYPE any "[structure] / 구조를 모름(Field Symbol사용) p2_stru STRUCTURE a1_stru "[structure] / 구조를 알고있음 p3_itab TYPE ANY TABLE "[itab] / 구조를 모름(Field Symbol사용) p4_itab LIKE a3_itab. "[itab] / 구조를 알고있음 ENDFORM. |
SubRoutine Call(호출) 방법 |
Internal |
PERFORM sub1 TABLES itab[] CHANGING wa1 wa1 itab itab.
PERFORM sub1 TABLES itab[] CHANGING wa1 wa1 itab itab ON COMMIT. PERFORM sub1 TABLES itab[] CHANGING wa1 wa1 itab itab ON ROLLBACK. |
같은프로그램에서 call할때
COMMIT를 만나 COMMIT되기전호출 ROLLBACK을만나ROLLBACK되기전호출 |
External |
PERFORM sub1(pg1) TABLES itab[] CHANGING wa1 wa1 itab itab
IF FOUND. |
다른프로그램에서 call할때. subroutine은 public속성을 가지고있음 |
Dynamic |
Data:progname(8) TYPE c VALUE 'Z05_001',subrname(8) TYPE C. subrname = 'concate'. TRANSLATE subrname TO UPPER CASE. PERFORM (subrname) IN PROGRAM (progname) IF FOUND. |
Runtime에 서브루틴을 바꾸어 call할때 |
List |
DO 3 TIMES. PERFORM SY-INDEX OF subr1 subr2 subr3. ENDDO. |
List를 이용한 Call
파라미터를 전달할 수 없다. |
Sample Code( 서브루틴에서/ 지정되지 않은 구조체와 itab을 <FS>를 통해 어떻게 가공하는지 보시기 바랍니다) |
DATA : a1_stru LIKE sflight, a2_stru LIKE sflight, a3_itab LIKE sflight OCCURS 0, a4_itab LIKE sflight OCCURS 0, a5_itab LIKE sflight OCCURS 0 WITH HEADER LINE. SELECT SINGLE * INTO CORRESPONDING FIELDS OF a1_stru FROM SFLIGHT. SELECT * INTO CORRESPONDING FIELDS OF TABLE a3_itab FROM SFLIGHT. a2_stru = a1_stru. a4_itab[] = a3_itab[]. a5_itab[] = a3_itab[]. PERFORM demo TABLES a5_itab CHANGING a1_stru a2_stru a3_itab a4_itab. FORM DEMO TABLES p5_itab LIKE a3_itab[] "[itab(header line)] / 구조를 알고있음 CHANGING p1_stru TYPE any "[structure] / 구조를 모름(Field Symbol사용) p2_stru STRUCTURE a1_stru "[structure] / 구조를 알고있음 p3_itab TYPE ANY TABLE "[itab] / 구조를 모름(Field Symbol사용) p4_itab LIKE a3_itab. "[itab] / 구조를 알고있음 "명시적으로 선언된 항목은 기존에 하던 방법대로 가공하면 된다. "p5_itab, p2_stru, p4_itab DATA : ls_itab LIKE LINE OF a3_itab. p5_itab-connid = '33'. p2_stru-connid = '33'. READ TABLE p4_itab INTO ls_itab INDEX 2. "구조를 알지못하는 항목에 대해서 가공해보자. "p1_stru, p3_itab DATA : lv_key TYPE string. FIELD-SYMBOLS : <fs_field> TYPE ANY, <fs_stru> TYPE ANY. ASSIGN COMPONENT 'CONNID' OF STRUCTURE p1_stru TO <fs_field>. <fs_field> = '33'. lv_key = 'CONNID'. READ TABLE p3_itab WITH KEY (lv_key) = '0400' ASSIGNING <fs_stru>. ASSIGN COMPONENT 'CONNID' OF STRUCTURE <fs_stru> TO <fs_field>. <fs_field> = '33'. MODIFY TABLE p3_itab FROM <fs_stru>. LOOP at p3_itab ASSIGNING <fs_stru>. ASSIGN COMPONENT 'CONNID' OF STRUCTURE <fs_stru> TO <fs_field>. <fs_field> = '33'. MODIFY TABLE p3_itab FROM <fs_stru>. ENDLOOP. ENDFORM. |