본문 바로가기
프로그래밍/RM-COBOL

[COBOL 기초] 서브 프로그램 호출(CALL ~ USING)과 데이터 연동 COBOL code 작성법

by 오!쎈세! 2026. 6. 22.
모든 로직을 한 파일에 다 넣지 않고, 공통 계산 모듈이나 세금 연산 로직 등을 별도의 서브 프로그램으로 쪼갠 뒤 메인에서 호출하여 데이터를 주고받는 모듈화 아키텍처 구현법을 알아본다.
🟪 1. 메인 프로그램 (MAINPROG.CBL) 데이터 설계
서브 프로그램으로 던져줄 전송용 변수들을 WORKING-STORAGE SECTION에 선언함. 대장 격인 01 레벨은 A영역(8칸)에, 하위 변수 05B영역(12칸)에 배치한다.
cobol code
12345678901234567890123456789012345678901234567890123456789012345678901234567890
       IDENTIFICATION DIVISION.
       PROGRAM-ID.  MAINPROG.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
*      =================================================================
*      [메인 메모리] 서브 프로그램과 주고받을 파라미터 변수 정의 (8칸 시작)
*      =================================================================
       01  PARAM-BLOCK.
           05  IN-PRICE    PIC 9(05)     VALUE 50000.
           05  OUT-TAX     PIC 9(05)     VALUE ZERO.

       PROCEDURE DIVISION.
       MAIN-LOGIC SECTION.
       A000-START.
           DISPLAY "--- MAIN PROGRAM START ---".
           DISPLAY "BEFORE CALL - PRICE: " IN-PRICE ", TAX: " OUT-TAX.

*          -------------------------------------------------------------
*          [서브 프로그램 호출] CALL 명령어로 SUBPROG를 깨우고 변수를 공유함 (12칸)
*          -------------------------------------------------------------
           CALL "SUBPROG" USING PARAM-BLOCK.
*          -> USING 뒤에 넘겨줄 변수 묶음(그룹 변수)을 타겟으로 지정함.
*          -> 서브 프로그램이 작동을 마치고 돌아오면 OUT-TAX에 계산된 값이 담기게 됨.

           DISPLAY "AFTER CALL  - PRICE: " IN-PRICE ", TAX: " OUT-TAX.
           DISPLAY "--- MAIN PROGRAM END ---".
           STOP RUN.
 
 

🟦 2. 서브 프로그램 (SUBPROG.CBL) 데이터 수신 및 처리
메인 프로그램이 던져준 데이터를 내부에 적재하는 LINKAGE SECTION을 정의하는 것이 핵심임. PROCEDURE DIVISION 뒤에 USING 키워드를 명시하여 데이터 매핑 통로를 개설해야 한다.
cobol code
12345678901234567890123456789012345678901234567890123456789012345678901234567890
       IDENTIFICATION DIVISION.
       PROGRAM-ID.  SUBPROG.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
*      [참고] 서브 프로그램 자체 내부에서만 쓰는 변수가 없다면 비워두어도 무방함.

*      =================================================================
*      [연결 저장소] 메인이 던진 데이터를 가리키는 임시 가상 공간 변수 정의 (8칸)
*      =================================================================
       LINKAGE SECTION.
       01  PASSED-BLOCK.
           05  SUB-PRICE   PIC 9(05).
           05  SUB-TAX     PIC 9(05).
*          -> ⚠️ 주의: 메인에서 보낸 PARAM-BLOCK과 구조 및 자릿수가 완벽히 일치해야 함.

*      =================================================================
*      [수신부 선언] 디비전 이름 선언부 뒤에 USING과 매핑 변수명을 적어줌 (8칸)
*      =================================================================
       PROCEDURE DIVISION USING PASSED-BLOCK.
       SUB-LOGIC SECTION.
       B000-CALC.
*          -------------------------------------------------------------
*          [비즈니스 로직] 넘겨받은 단가를 기준으로 10% 세금 계산 수행 (12칸 시작)
*          -------------------------------------------------------------
           COMPUTE SUB-TAX = SUB-PRICE * 0.10.

*          -------------------------------------------------------------
*          [메인 복귀] STOP RUN이 아닌 EXIT PROGRAM을 써야 메인으로 제어권이 넘어감
*          -------------------------------------------------------------
           EXIT PROGRAM.
 
 

💡 [실무 팁] CALL ~ USING 구조에서 가장 많이 터지는 대형 에러 2가지
서브 프로그램 연동은 포인터 주소를 공유하는 개념이기 때문에 메모리 규격을 맞추지 않으면 시스템이 즉시 셧다운(Abend)됨.
  • 1. 메인 변수와 서브 변수의 구조/바이트 수는 무조건 1:1 일치해야 한다
    • 메인에서는 5자리 숫자(PIC 9(05))로 보냈는데, 서브의 LINKAGE SECTION에서 3자리 숫자(PIC 9(03))로 받아버리면 메모리 침범(Memory Overlay)이 발생함.
    • 엉뚱한 주소의 메모리를 갉아먹어 값이 깨지거나 데이터 예외 에러가 터지므로, 양쪽 변수의 레이아웃과 데이터 타입은 쌍둥이처럼 똑같이 설계해야 함.
  • 2. 서브 프로그램 끝에는 절대로 STOP RUN을 쓰면 안 된다
    • STOP RUN은 실행 중인 메모리 프로세스 자체를 완전히 죽여버리는 명령어임.
    • 서브 프로그램 로직 마지막에 STOP RUN을 적어두면, 계산을 끝내고 메인 프로그램으로 돌아가지 못하고 전체 시스템이 그 자리에서 강제 종료됨. 서브 프로그램의 종결어미는 반드시 EXIT PROGRAM을 사용해야 안전하다.