๊ด€๋ฆฌ ๋ฉ”๋‰ด

CS Student’s SAP&Tech Journey๐Ÿ’ซ

[SAP] ๋กœ์ปฌ ๋ชจ๋“ˆ Subroutine(์„œ๋ธŒ๋ฃจํ‹ด)์ด๋ž€? / FORM ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ถœํ•˜๊ธฐ / Call by Value, Call by Reference ๋ณธ๋ฌธ

SAP/๋กœ์ปฌ ๋ชจ๋“ˆ Subroutine

[SAP] ๋กœ์ปฌ ๋ชจ๋“ˆ Subroutine(์„œ๋ธŒ๋ฃจํ‹ด)์ด๋ž€? / FORM ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ถœํ•˜๊ธฐ / Call by Value, Call by Reference

์ธํฌ๋งˆํ‹ฑ 2025. 1. 31. 18:08

ABAP์—์„œ๋Š” ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋ชจ๋“ˆํ™”๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” Local Module vs Global Module ์ฐจ์ดFORM์„ ํ™œ์šฉํ•œ ์„œ๋ธŒ๋ฃจํ‹ด ์ •์˜ ๋ฐ ํ˜ธ์ถœ, ๊ทธ๋ฆฌ๊ณ  Call by Value vs Call by Reference์˜ ์ฐจ์ด๋ฅผ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค.

 


 

์„œ๋ธŒ ๋ฃจํ‹ด์ด๋ž€?

 

๐ŸŽฏ Local Module vs Global Module ์ฐจ์ด

ABAP์—์„œ ๋ชจ๋“ˆ์€ ํฌ๊ฒŒ ๋กœ์ปฌ(Local) ๋ชจ๋“ˆ๊ณผ ๊ธ€๋กœ๋ฒŒ(Global) ๋ชจ๋“ˆ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

 1. Local Module (๋กœ์ปฌ ๋ชจ๋“ˆ)

  • ํ•œ ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • FORM ... ENDFORM์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜
  • ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•˜์—ฌ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • Subroutine, Local Class

์˜ˆ์ œ:

FORM display_message.
    WRITE: 'Hello, this is a local module!'.
ENDFORM.

START-OF-SELECTION.
    PERFORM display_message.

 

2. Global Module (๊ธ€๋กœ๋ฒŒ ๋ชจ๋“ˆ)

  • ์—ฌ๋Ÿฌ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • Function Module์ด๋‚˜ Class Method๋กœ ์ •์˜
  • SE37์—์„œ Function Module ์ƒ์„ฑ ๊ฐ€๋Šฅ
  • Function Group, Global Class

์˜ˆ์ œ: Function Module์„ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•

DATA: lv_result TYPE i.
CALL FUNCTION 'Z_MY_FUNCTION'
  EXPORTING
    iv_value1 = 10
    iv_value2 = 20
  IMPORTING
    ev_result = lv_result.
WRITE: / '๊ฒฐ๊ณผ:', lv_result.

 

โœ… FORM์„ ํ™œ์šฉํ•œ ์„œ๋ธŒ๋ฃจํ‹ด ์ •์˜ ๋ฐ ํ˜ธ์ถœ

์„œ๋ธŒ๋ฃจํ‹ด(Subroutine)์€ FORM ... ENDFORM์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜๋ฉ๋‹ˆ๋‹ค. ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋™์ผํ•œ ์ฝ”๋“œ ๋ธ”๋ก์„ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

1. ์„œ๋ธŒ๋ฃจํ‹ด ๊ธฐ๋ณธ ๊ตฌ์กฐ

FORM subroutine_example.
    WRITE: '์„œ๋ธŒ ๋ฃจํ‹ด ์ž…๋‹ˆ๋‹ค'.
ENDFORM.

START-OF-SELECTION.
    PERFORM subroutine_example.

 

 2. ํŒŒ๋ผ๋ฏธํ„ฐ ์ „๋‹ฌ

์„œ๋ธŒ๋ฃจํ‹ด์—์„œ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋ ค๋ฉด USING(call by value)๊ณผ CHANGING(call by reference)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

FORM add_numbers USING lv_num1 TYPE i
                      lv_num2 TYPE i
               CHANGING lv_result TYPE i.
    lv_result = lv_num1 + lv_num2.
ENDFORM.

START-OF-SELECTION.
    DATA: lv_output TYPE i.
    PERFORM add_numbers USING 5 10 CHANGING lv_output.
    WRITE: / '๊ฒฐ๊ณผ:', lv_output.

 

โœ… ์„œ๋ธŒ๋ฃจํ‹ด ๊ฐ’ ์ „๋‹ฌ ๋ฐฉ์‹ Call by Value ์™€ Call by Reference์˜ ์ฐจ์ด

์„œ๋ธŒ๋ฃจํ‹ด์—์„œ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์—๋Š” Call by Value์™€ Call by Reference๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

1. Call by Value (๊ฐ’ ์ „๋‹ฌ) 

  • ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ณต์‚ฌํ•˜์—ฌ ์ „๋‹ฌ
  • ์„œ๋ธŒ๋ฃจํ‹ด์—์„œ ๋ณ€๊ฒฝํ•ด๋„ ์›๋ณธ ๊ฐ’์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ
  • FORM ์„œ๋ธŒ๋ฃจํ‹ด์ด๋ฆ„ USING value(์™ธ๋ถ€์—์„œ ์ „๋‹ฌ๋œ ๋ณ€์ˆ˜๊ฐ’ ๋ฐ›๋Š” ๋ณ€์ˆ˜) TYPE ํƒ€์ž….
  • PERFORM: ์„œ๋ธŒ๋ฃจํ‹ด์„ ํ˜ธ์ถœํ•˜์—ฌ ์ž…๋ ฅ๊ฐ’์„ ์ „๋‹ฌํ•จ.
  • FORM: ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ์ถœ๋ ฅ์„ ์ˆ˜ํ–‰ํ•จ.
PARAMETERS p_name1 TYPE scustom-name.
PARAMETERS p_name2 TYPE scustom-name.

PERFORM sub_name USING p_name1.
PERFORM sub_name USING p_name2.

FORM sub_name USING value(f_name) TYPE scustom-name.
  WRITE: /'HELLO', f_name.
ENDFORM.

 

  • sub_name ์ด๋ผ๋Š” ์„œ๋ธŒ๋ฃจํ‹ด์„ ์ •์˜ํ•œ๋‹ค.
  • USING value(f_name) TYPE scustom-name:
    • USING์€ ์™ธ๋ถ€์—์„œ ์ „๋‹ฌ๋œ ๊ฐ’(Actual Parameter)์„ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•  ๋•Œ ์“ฐ์ž„.
    • value(f_name)์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ’(Call by Value)์œผ๋กœ ์ „๋‹ฌ๋˜๊ณ , ๋‚ด๋ถ€์—์„œ ๋ณ€๊ฒฝํ•ด๋„ ์›๋ž˜ ๋ณ€์ˆ˜(p_name1, p_name2)์— ์˜ํ–ฅ ์—†์Œ.

 

2. Call by Reference (์ฐธ์กฐ ์ „๋‹ฌ)

  • ๋ณ€์ˆ˜์˜ ์ฐธ์กฐ(์ฃผ์†Œ)๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์›๋ณธ ๊ฐ’์„ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
  • CHANGING ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฐธ์กฐ๋กœ ์ „๋‹ฌ
PARAMETERS p_id1 TYPE scustom-id.
PARAMETERS p_id2 TYPE scustom-id.

PERFORM sub_id CHANGING p_id1.
PERFORM sub_id CHANGING p_id2.

FORM sub_id CHANGING f_id TYPE scustom-id.
  WRITE: / 'id๋Š”', f_id.
ENDFORM.

 

๐Ÿ“Œ ์„œ๋ธŒ๋ฃจํ‹ด ์˜ˆ์ œ

1) ๊ณ„์‚ฐ๊ธฐ ๊ตฌํ˜„ํ•˜๊ธฐ

PARAMETERS: lv_num1 TYPE I, lv_num2 TYPE I, lv_oper TYPE string.
DATA lv_result TYPE I.

PERFORM sub_cal USING lv_num1 lv_num2 lv_oper
      CHANGING lv_result. "์ฒ˜์Œ์—๋Š” ๋น„์–ด ์žˆ์ง€๋งŒ, FORM ๋‚ด๋ถ€์—์„œ ๊ฐ’์ด ํ• ๋‹น
WRITE: '๊ณ„์‚ฐ ๊ฐ’์€', lv_result.

FORM sub_cal USING
      value(f_num1) TYPE I
      value(f_num2) TYPE I
      value(f_oper) TYPE STRING
      CHANGING f_result. "f_result๋Š” lv_result๋ฅผ ์ง์ ‘ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜
              "์ฆ‰, f_result์— ๊ฐ’์ด ํ• ๋‹น๋˜๋ฉด, ์ด๋Š” ๊ณง๋ฐ”๋กœ lv_result์—๋„ ๋ฐ˜์˜๋จ.

  CASE f_oper.
    WHEN '+'.
      f_result = f_num1 + f_num2.
    WHEN '-'.
      f_result = f_num1 - f_num2.
    WHEN '*'.
      f_result = f_num1 * f_num2.
    WHEN '/'.
      IF f_num2 <> 0.
        f_result = f_num1 / f_num2.
      ELSE.
        WRITE: / 'num2 ์—๋Ÿฌ'.
      ENDIF.
  ENDCASE.

ENDFORM.

 

2) ํ•ญ๊ณต์‚ฌ ์ฝ”๋“œ 2๊ฐœ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ํ•ด๋‹น ํ•ญ๊ณต์‚ฌ์˜ ์ด๋ฆ„๊ณผ url ์ถœ๋ ฅํ•˜๊ธฐ

PARAMETERS gs_id1 TYPE scarr-carrid.
PARAMETERS gs_id2 TYPE scarr-carrid.

DATA gs_info1 TYPE SCARR.
DATA gs_info2 TYPE SCARR.

PERFORM get_id USING gs_id1 Changing gs_info1.
PERFORM get_id USING gs_id2 Changing gs_info2.

WRITE: / gs_info1-carrname+0(10), gs_info1-url+0(32).
WRITE: / gs_info2-carrname+0(10), gs_info2-url+0(32).

FORM get_id USING value(f_id) TYPE scarr-carrid
      Changing f_info TYPE SCARR.

  CLEAR f_info.
  SELECT SINGLE *
    FROM SCARR
    INTO f_info
    WHERE carrid = f_id.

ENDFORM.