SAP ABAP/기본

서브루틴 (Subroutine)과 파라미터 전달 방식 (CALL BY REFERENCE / RESULT / VALUE / USING / CHANGING)

물꼬_ 2025. 1. 21. 19:30

서브루틴(Subroutine)이란?

  • 자주 사용하는 코드 블록을 묶어 필요할 때 호출하는 기능이다.
  • 반복적인 코드 작성을 줄이고, 유지보수를 쉽게 하기 위해 사용된다.
  • 마치 "요리 레시피"처럼 미리 만들어두고, 필요할 때 호출하여 실행할 수 있다.
  • ABAP에서는 FORM ~ ENDFORM 구문을 사용하여 서브루틴을 정의한다.

📍 서브루틴의 주요 파라미터 전달 방식

ABAP 서브루틴에서 외부 변수(파라미터)를 전달하는 방식에는 USING과 CHANGING 두 가지가 있다.

키워드 설명 변경 가능 여부 전달 방식

키워드 설명 변경 가능 여부 전달 방식
USING 서브루틴에서 읽기 전용(Read-Only) 사용 ❌ (변경 불가) CALL BY VALUE (값 복사) 또는 CALL BY REFERENCE (주소 참조)
CHANGING 서브루틴 내부에서 값을 변경할 수 있음 ✅ (변경 가능) CALL BY REFERENCE (주소 참조) 또는 CALL BY RESULT (결과 반환)

USING 추천 상황

✔️ 원본 변수를 그대로 사용해야 하는 경우

✔️ 서브루틴 내부에서 값을 변경하면 안 되는 경우

✔️ 예: 변수의 값을 단순 출력할 때

CHANGING 추천 상황

✔️ 서브루틴 내부에서 값을 변경해야 하는 경우

✔️ 계산 후 결과 값을 원본 변수에 반영해야 하는 경우

✔️ 예: 연산 결과를 저장해야 하는 경우


📍 서브루틴 생성 방법

1️⃣ 서브루틴 파일을 통해 생성

  1. 원하는 Program을 선택
  2. Create → Subroutines 선택
  3. 서브루틴 이름 입력
  4. 왼쪽 블록에서 마스터 선택 후 완료
  5. 정보 입력 후 Activate(활성화)
  6. 생성된 서브루틴을 프로그램에서 호출하여 사용

📌 서브루틴에서 사용하는 파라미터 전달 방식

서브루틴을 사용할 때 파라미터를 전달하는 방식에는 3가지가 있다.

방식 설명 특징

CALL BY REFERENCE 변수의 메모리 주소를 직접 참조 서브루틴에서 값을 변경하면 원본 값도 변경됨
CALL BY RESULT 결과 값만 반환 서브루틴이 실행된 후 변경된 값이 원본 변수에 반영됨
CALL BY VALUE 값을 복사하여 전달 서브루틴 내부에서 변경해도 원본 변수에는 영향을 주지 않음

📌 CALL BY REFERENCE (참조에 의한 호출)

  • 변수의 메모리 주소를 직접 참조하여 값을 변경한다.
  • 서브루틴에서 값을 수정하면 원래 변수에도 즉시 반영됨.
  • 성능이 빠르지만, 원본 값이 직접 수정되므로 주의가 필요.

🔹 예제 코드

REPORT ZCALL_BY_REFERENCE.

DATA: lv_num TYPE i VALUE 10.

PERFORM change_value USING lv_num.

WRITE: / '변경 후 값:', lv_num.

FORM change_value USING p_num TYPE i.
  p_num = p_num + 5.
ENDFORM.

📌 실행 결과

변경 후 값: 15

변수 lv_num의 값이 서브루틴 내에서 직접 변경됨.


📌 CALL BY RESULT (결과에 의한 호출)

  • 서브루틴 실행이 끝난 후, 결과 값만 원래 변수에 반영됨.
  • 서브루틴 내부에서 수정된 값은 즉시 원본 변수에 반영되지 않음.
  • 서브루틴이 끝난 후에야 결과 값이 업데이트됨.

🔹 예제 코드

REPORT ZCALL_BY_RESULT.

DATA: lv_num TYPE i VALUE 10.

PERFORM change_value CHANGING lv_num.

WRITE: / '변경 후 값:', lv_num.

FORM change_value CHANGING p_num TYPE i.
  p_num = p_num + 5.
ENDFORM.

📌 실행 결과

변경 후 값: 15

서브루틴이 종료된 후에야 lv_num의 값이 변경됨.


📌 CALL BY VALUE (값에 의한 호출)

  • 변수의 값을 복사하여 전달함.
  • 서브루틴 내부에서 변경해도 원본 변수에는 영향을 주지 않음.

🔹 예제 코드

REPORT ZCALL_BY_VALUE.

DATA: lv_num TYPE i VALUE 10.

PERFORM change_value USING lv_num.

WRITE: / '변경 후 값:', lv_num.

FORM change_value USING VALUE( p_num ) TYPE i.
  p_num = p_num + 5.
  WRITE: / '서브루틴 내부 값:', p_num.
ENDFORM.

📌 실행 결과

서브루틴 내부 값: 15
변경 후 값: 10

서브루틴 내부에서는 p_num 값이 변경되었지만, 원래 변수 lv_num은 변경되지 않음.


🚀 CALL BY REFERENCE vs. CALL BY RESULT vs. CALL BY VALUE 비교

방식 특징 원본 값 변경 시점 성능 사용 예시

CALL BY REFERENCE 메모리 주소를 참조 즉시 변경 빠름 값이 즉시 반영되어야 할 때
CALL BY RESULT 결과만 반환 서브루틴 종료 후 변경 다소 느림 연산 후 결과만 반환해야 할 때
CALL BY VALUE 값 복사 후 전달 변경되지 않음 느림 원본 데이터 보호가 필요할 때

CALL BY REFERENCE 사용 추천

✔️ 빠른 성능이 필요할 때

✔️ 메모리 사용을 최적화해야 할 때

✔️ 원본 값을 직접 수정하는 것이 문제가 되지 않을 때

CALL BY RESULT 사용 추천

✔️ 원본 값이 즉시 변경되지 않아야 할 때

✔️ 서브루틴에서 계산 후 결과를 반환할 때

✔️ 안전한 데이터 처리를 원할 때

CALL BY VALUE 사용 추천

✔️ 서브루틴에서 값을 변경해도 원본 값을 유지해야 할 때

✔️ 값을 안전하게 복사하여 사용할 때

✔️ 메모리 사용이 증가해도 문제가 없을 때


📌 요약

✔️ 서브루틴(Subroutine)은 코드 재사용을 위해 사용

✔️ USING은 읽기 전용으로 사용되며, 서브루틴 내부에서 변경할 수 없음

✔️ CHANGING은 변경 가능하며, 서브루틴에서 수정한 값이 원본 변수에 반영됨

✔️ CALL BY VALUE, CALL BY REFERENCE, CALL BY RESULT의 차이를 이해하고 적절한 방식 사용


💡 핵심 정리

서브루틴을 사용할 때 CALL BY REFERENCE, CALL BY RESULT, CALL BY VALUE의 차이를 이해하면 성능 최적화와 안정성을 동시에 확보할 수 있다.

원본 값을 보호하려면 USING을 사용하고, 값 변경이 필요하면 CHANGING을 사용해야 한다. 🚀

 

서브루틴 호출
서브루틴 내부