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

[COBOL 기초] 소수점 편집 마스크(PIC Z, .)와 COBOL code 변환 출력법

by 오!쎈세! 2026. 6. 22.
🏷️ [RM-COBOL] 소수점 편집 마스크(PIC Z, .)와 COBOL code 변환 출력법
전 편에서 평균을 구했을 때 사용한 가상 소수점(V) 변수는 연산용일 뿐이라 화면 출력 시 실제 소수점(.)이 찍히지 않고 통글자로 나옴. 이를 해결하기 위해 사람이 읽기 편한 형태로 포맷을 바꾸는 출력용 편집 마스크 코드를 알아본다.

 

🟪 1. 데이터 정의와 출력용 변수 설계 (DATA DIVISION)
연산에 사용하는 변수와 화면 출력에 사용하는 변수를 분리하여 선언해야 함. 대장 격인 01 레벨은 A영역(8칸)에, 하위 변수 05와 데이터 포맷인 PIC 구문은 B영역(12칸)에 배치하여 들여쓰기 계층 구조를 만든다.
cobol code
12345678901234567890123456789012345678901234567890123456789012345678901234567890
       DATA DIVISION.
       WORKING-STORAGE SECTION.
*      =================================================================
*      [독립 저장소] 변수 대장 격인 '01' 레벨은 반드시 8번째 칸(Area A) 시작임
*      =================================================================
       01  CALC-RECORDS.
*          -------------------------------------------------------------
*          [연산용 변수] V는 가상 소수점임. 내부 계산용이며 화면엔 점(.)이 안 찍힘
*          -------------------------------------------------------------
           05  AVG-CALC    PIC 9(03)V99   VALUE 088.33.

       01  PRINT-RECORDS.
*          -------------------------------------------------------------
*          [출력용 편집 마스크 변수] 실제 소수점(.) 문자를 박아 넣는 구역임
*          -------------------------------------------------------------
           05  AVG-PRINT   PIC ZZ9.99.
*          -> Z는 의미 없는 앞자리 숫자 0을 공백(Space)으로 밀어버리는 제로 서프레스임.
*          -> 점(.)은 가상이 아닌, 실제 화면에 소수점 문자를 출력하라는 명령임.
 
 

🟩 2. 데이터 이동 및 포맷 변환 실행 (PROCEDURE DIVISION)
연산용 변수의 값을 출력용 변수로 옮기는 단계임. 이정표 문단은 A영역(8칸)에 적고, 실질적으로 일하는 명령어(MOVE, DISPLAY)는 무조건 B영역(12칸)에서 연산 처리를 해야 함.
cobol code
12345678901234567890123456789012345678901234567890123456789012345678901234567890
       PROCEDURE DIVISION.
       MAIN-LOGIC SECTION.
       A000-START.
*          -------------------------------------------------------------
*          [포맷 변환] 연산용 변수를 출력용 변수로 MOVE 하면 코볼이 자동 변환해 줌
*          -------------------------------------------------------------
           MOVE AVG-CALC TO AVG-PRINT.

*          -------------------------------------------------------------
*          [화면 출력] COBOL code 변환 전후의 화면 결과 출력 비교
*          -------------------------------------------------------------
           DISPLAY "변환 전 원본 COBOL code 데이터: " AVG-CALC.
*          -> 화면 출력 결과: 08833 (소수점 기호가 없어 금액이나 점수 식별 불가)

           DISPLAY "변환 후 편집 COBOL code 데이터: " AVG-PRINT.
*          -> 화면 출력 결과:  88.33 (앞자리 0은 공백 처리되고 실제 소수점이 찍힘)

           STOP RUN.
 
 

💡 [실무 팁] 왜 PIC ZZZ.ZZ가 아니라 ZZ9.99를 쓸까?
출력 형식을 지정할 때 무심코 모든 자릿수를 Z로 채우면 치명적인 출력 대형 사고가 발생할 수 있음.
  • PIC ZZZ.ZZ의 위험성 (전체 공백 발생)
    • 만약 학생의 평균 점수가 딱 0점인 경우, 000.00 이라는 데이터가 들어오게 됨.
    • 이때 변수가 ZZZ.ZZ로 선언되어 있으면 컴파일러는 모든 0을 의미 없는 숫자로 판단하여 화면에 아무것도 안 적고 통공백(" ")으로 밀어버림. 성적표에 0점이 공백으로 나오면 시스템 에러처럼 보임.
  • PIC ZZ9.99의 안정성 (최소한의 자릿수 보장)
    • 일의 자리에 9를 뚫어놓으면 앞자리가 전부 0이더라도 최소한 일의 자리 숫자 0과 소수점 이하 자리들은 화면에 명확하게 0.00으로 찍히게 됨.
    • 따라서 실무 COBOL code 작성 시에는 마지막 일의 자리와 소수점 이하는 9로 채워두는 것이 표준 원칙이다.