✅ 서브루틴(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️⃣ 서브루틴 파일을 통해 생성
- 원하는 Program을 선택
- Create → Subroutines 선택
- 서브루틴 이름 입력
- 왼쪽 블록에서 마스터 선택 후 완료
- 정보 입력 후 Activate(활성화)
- 생성된 서브루틴을 프로그램에서 호출하여 사용
📌 서브루틴에서 사용하는 파라미터 전달 방식
서브루틴을 사용할 때 파라미터를 전달하는 방식에는 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을 사용해야 한다. 🚀


'SAP ABAP > 기본' 카테고리의 다른 글
Structures Variable (스트럭쳐 타입) (0) | 2025.01.26 |
---|---|
Function Module(함수 모듈) 생성 및 사용 방법 (0) | 2025.01.21 |
서브루틴(Subroutine) vs 펑션 모듈(Function Module) – 차이점 비교 (0) | 2025.01.19 |
오류 수정 - ABAP Debugger 사용법 (0) | 2025.01.15 |
메시지 클래스 - Dialog Messages (3) | 2025.01.15 |