모든 로직을 한 파일에 다 넣지 않고, 공통 계산 모듈이나 세금 연산 로직 등을 별도의 서브 프로그램으로 쪼갠 뒤 메인에서 호출하여 데이터를 주고받는 모듈화 아키텍처 구현법을 알아본다.
🟪 1. 메인 프로그램 (MAINPROG.CBL) 데이터 설계
서브 프로그램으로 던져줄 전송용 변수들을 WORKING-STORAGE SECTION에 선언함. 대장 격인 01 레벨은 A영역(8칸)에, 하위 변수 05는 B영역(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을 사용해야 안전하다.
'프로그래밍 > RM-COBOL' 카테고리의 다른 글
| [COBOL 기초] 종합 프로젝트: 실전 성적 시스템 구축으로 마스터하는 COBOL code (0) | 2026.06.22 |
|---|---|
| [COBOL 기초] 특수 제어문(STRING, EVALUATE)으로 가독성을 높이는 COBOL code 작성법 (0) | 2026.06.22 |
| [COBOL 기초] 대량 데이터 정렬(SORT)과 병합(MERGE) 처리를 위한 COBOL code 작성법 (0) | 2026.06.22 |
| [COBOL 기초] 파일 입출력(READ/WRITE)으로 텍스트 파일 제어하는 COBOL code 작성법 (0) | 2026.06.22 |
| [COBOL 기초] 파일 입출력(READ/WRITE)으로 텍스트 파일 제어하는 COBOL code 작성법 (0) | 2026.06.22 |