코딩 · 프로그래밍 언어
초보자를 위한 COBOL 기초 튜토리얼
핵심 답변
COBOL(Common Business-Oriented Language)은 레코드, 파일, 보고서, 정확한 십진 연산 같은 업무 데이터 처리를 위해 설계된 컴파일 방식 언어입니다. 프로그램은 네 개의 디비전으로 나뉘고, 데이터는 PIC(picture) 절로 기술하며, 코드는 ADD AMOUNT TO TOTAL처럼 영어 문장처럼 읽힙니다. 지금도 은행, 보험사, 정부의 핵심 시스템을 구동하며 대부분 IBM 메인프레임에서 실행됩니다. 무료 GnuCOBOL 컴파일러로 cobc -x hello.cob처럼 무료로 배울 수 있습니다.
COBOL이란 무엇이며 누가 쓰는가
COBOL은 1959년 CODASYL 위원회가 설계했으며 Grace Hopper의 앞선 언어 FLOW-MATIC의 영향을 크게 받았습니다. ISO가 표준화하며, 이후 표준에 구조적 프로그래밍, 객체지향 등의 기능이 추가되었고 가장 최근 개정판은 2023년에 발행되었습니다.
COBOL은 배치 처리와 트랜잭션 시스템에 쓰입니다. 계좌 처리, 급여, 보험금 청구, 세금과 복지 시스템이 그렇습니다. 이 코드의 상당수는 IBM Z 메인프레임에서 IBM Enterprise COBOL로 실행되며, 트랜잭션에는 CICS, 데이터에는 Db2를 함께 씁니다. 이런 시스템을 유지보수하고 현대화하는 일자리는 여전히 흔합니다.
GnuCOBOL 설치와 Hello, world 실행
GnuCOBOL은 COBOL을 C로 변환한 다음 네이티브 프로그램으로 만드는 무료 컴파일러입니다. 많은 Linux 배포판에서 gnucobol 패키지로, macOS에서는 Homebrew로 설치할 수 있으며 Windows 사용자는 WSL이나 미리 빌드된 패키지를 쓸 수 있습니다.
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
PROCEDURE DIVISION.
DISPLAY "Hello, world!".
STOP RUN.cobc -x hello.cob
./hello
# Hello, world!코드는 전통적인 고정 형식을 사용합니다. 1~6열은 순서 번호, 7열은 주석(*)이나 이어쓰기 줄 표시, A 영역(8~11열)은 디비전, 섹션, 단락 이름, B 영역(12~72열)은 문장입니다. GnuCOBOL은 cobc -x -free로 자유 형식 소스도 받습니다. -x 옵션은 모듈이 아니라 실행 파일을 만듭니다.
네 개의 디비전
| 디비전 | 용도 |
|---|---|
| IDENTIFICATION DIVISION | 프로그램 이름을 지정(PROGRAM-ID) |
| ENVIRONMENT DIVISION | 프로그램을 외부 세계와 연결. 예를 들어 사용할 파일 |
| DATA DIVISION | 파일 레코드, 작업 저장소, 매개변수 등 모든 데이터를 선언 |
| PROCEDURE DIVISION | 단락으로 구성된 실행문 |
모든 변수는 사용하기 전에 DATA DIVISION에서 선언해야 합니다. WORKING-STORAGE SECTION은 프로그램의 변수를, FILE SECTION은 파일 레코드를, LINKAGE SECTION은 호출자가 넘기는 매개변수를 기술합니다.
데이터와 PIC 절
COBOL은 데이터를 정확한 레이아웃으로 기술합니다. 레벨 번호는 계층을 나타내고(01은 레코드, 05는 그 안의 필드), PIC 절은 형식을 지정합니다. X는 아무 문자, 9는 숫자, S는 부호, V는 암묵적 소수점입니다.
| 선언 | 의미 | 예시 값 |
|---|---|---|
PIC X(10) | 10문자, 공백으로 채움 | "Ana " |
PIC 9(3) | 부호 없는 3자리 숫자 | 030 |
PIC S9(5)V99 | 부호 있음, 소수점 앞 5자리와 뒤 2자리 | -01234.50 |
PIC $ZZ,ZZ9.99 | 편집 출력: 통화 기호, 앞쪽 0은 공백으로 | $ 1,234.50 |
PIC S9(7)V99 COMP-3 | 메인프레임에서 흔한 팩 십진수 | 5바이트에 저장 |
88 IS-DONE VALUE "Y" | 조건 이름: 부모 필드에 대한 불리언 검사 | IF IS-DONE |
IDENTIFICATION DIVISION.
PROGRAM-ID. DATA-DEMO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NAME PIC X(10) VALUE "Ana".
01 WS-AGE PIC 9(3) VALUE 30.
01 WS-PRICE PIC S9(5)V99 VALUE 1234.50.
01 WS-PRICE-OUT PIC $ZZ,ZZ9.99.
01 WS-CUSTOMER.
05 WS-FIRST PIC X(10).
05 WS-LAST PIC X(15).
PROCEDURE DIVISION.
MOVE WS-PRICE TO WS-PRICE-OUT
DISPLAY WS-NAME "is " WS-AGE
DISPLAY "Price: " WS-PRICE-OUT
STOP RUN.
*> Ana is 030
*> Price: $ 1,234.50숫자를 십진수로 저장하므로 0.10 + 0.20은 정확히 0.30이며, 이것이 COBOL이 금액에 적합한 이유 중 하나입니다. WS-CUSTOMER는 그룹 항목으로, 통째로도 필드별로도 옮길 수 있습니다.
제어 흐름: IF, EVALUATE, PERFORM
IDENTIFICATION DIVISION.
PROGRAM-ID. CONTROL-DEMO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-I PIC 99.
01 WS-TOTAL PIC 9(4) VALUE 0.
01 WS-SCORE PIC 999 VALUE 85.
PROCEDURE DIVISION.
PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 10
ADD WS-I TO WS-TOTAL
END-PERFORM
DISPLAY "Total: " WS-TOTAL
EVALUATE TRUE
WHEN WS-SCORE >= 90
DISPLAY "A"
WHEN WS-SCORE >= 80
DISPLAY "B"
WHEN OTHER
DISPLAY "C"
END-EVALUATE
IF WS-TOTAL > 50
DISPLAY "big"
ELSE
DISPLAY "small"
END-IF
STOP RUN.
*> Total: 0055
*> B
*> bigPERFORM VARYING은 COBOL의 카운팅 반복문이고 PERFORM UNTIL condition은 while 반복문입니다. EVALUATE는 switch 문입니다. END-IF, END-PERFORM 같은 범위 종결자가 각 블록을 닫고, 마침표는 문장 전체를 끝냅니다.
단락, 산술, 테이블
COBOL에는 일반적인 의미의 함수가 없습니다. 로직을 이름 있는 단락으로 나누어 PERFORM으로 실행하고, 더 큰 단위는 CALL "PROG" USING ...으로 호출하는 별도 프로그램이 됩니다. 산술은 동사(ADD, SUBTRACT, MULTIPLY, DIVIDE) 또는 수식을 쓰는 COMPUTE를 사용합니다. 배열은 테이블이라 부르며 OCCURS로 선언하고 인덱스는 1부터 시작합니다.
IDENTIFICATION DIVISION.
PROGRAM-ID. PARA-DEMO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-PRICES.
05 WS-PRICE PIC 9(3)V99 OCCURS 3 TIMES.
01 WS-I PIC 9.
01 WS-SUM PIC 9(4)V99 VALUE 0.
01 WS-SUM-OUT PIC Z,ZZ9.99.
PROCEDURE DIVISION.
MAIN-PARA.
MOVE 10.50 TO WS-PRICE(1)
MOVE 4.25 TO WS-PRICE(2)
MOVE 7.00 TO WS-PRICE(3)
PERFORM ADD-PRICE VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 3
COMPUTE WS-SUM = WS-SUM * 1.1
MOVE WS-SUM TO WS-SUM-OUT
DISPLAY "With 10% tax: " WS-SUM-OUT
STOP RUN.
ADD-PRICE.
ADD WS-PRICE(WS-I) TO WS-SUM.
*> With 10% tax: 23.92합계는 21.75이고 1.1을 곱하면 23.925이지만, COMPUTE ... ROUNDED를 쓰지 않으면 COBOL은 선언된 소수 두 자리(23.92)로 잘라 버립니다.
오류 처리
COBOL은 일상적인 코드에 예외가 없습니다. 대신 문장에 조건 구문이 있습니다. 산술 오버플로나 0으로 나누기에는 ON SIZE ERROR, 파일 끝에는 AT END, 인덱스 파일에는 INVALID KEY가 있고, 모든 파일 작업 뒤에 두 문자 코드를 받는 FILE STATUS 필드가 있습니다("00"은 성공).
DIVIDE WS-A BY WS-B GIVING WS-C
ON SIZE ERROR
DISPLAY "Division failed"
NOT ON SIZE ERROR
DISPLAY "Result: " WS-C
END-DIVIDE작은 완성 프로그램: 판매 파일 합계
파일에서 고정 레이아웃 레코드를 읽는 것은 전형적인 COBOL 작업입니다. 이 프로그램은 sales.txt를 읽는데, 각 줄은 10문자의 품목 이름 뒤에 암묵적 소수 두 자리의 7자리 금액이 옵니다.
apples 0001250
pears 0000899
plums 0002000 IDENTIFICATION DIVISION.
PROGRAM-ID. SALES-TOTAL.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT SALES-FILE ASSIGN TO "sales.txt"
ORGANIZATION IS LINE SEQUENTIAL
FILE STATUS IS WS-FS.
DATA DIVISION.
FILE SECTION.
FD SALES-FILE.
01 SALES-REC.
05 SR-ITEM PIC X(10).
05 SR-AMOUNT PIC 9(5)V99.
WORKING-STORAGE SECTION.
01 WS-FS PIC XX.
01 WS-EOF PIC X VALUE "N".
88 NO-MORE-RECORDS VALUE "Y".
01 WS-TOTAL PIC 9(7)V99 VALUE 0.
01 WS-TOTAL-OUT PIC Z,ZZZ,ZZ9.99.
PROCEDURE DIVISION.
OPEN INPUT SALES-FILE
IF WS-FS NOT = "00"
DISPLAY "Cannot open file, status " WS-FS
STOP RUN
END-IF
PERFORM UNTIL NO-MORE-RECORDS
READ SALES-FILE
AT END SET NO-MORE-RECORDS TO TRUE
NOT AT END ADD SR-AMOUNT TO WS-TOTAL
END-READ
END-PERFORM
CLOSE SALES-FILE
MOVE WS-TOTAL TO WS-TOTAL-OUT
DISPLAY "Total sales: " WS-TOTAL-OUT
STOP RUN.실행하면 Total sales: 뒤에 12문자 편집 필드에서 오른쪽 정렬된 41.49를 출력합니다. LINE SEQUENTIAL은 한 줄에 레코드 하나인 텍스트 파일을 뜻하며 GnuCOBOL과 다른 PC 컴파일러가 지원합니다. 메인프레임 프로그램은 보통 JCL로 정의한 고정 길이 데이터셋을 읽습니다.
다음 단계
- 전체 언어 레퍼런스를 위한 GnuCOBOL 프로젝트 페이지와 Programmer's Guide.
- 메인프레임 COBOL, CICS, Db2 사용법을 다룬 IBM의 Enterprise COBOL for z/OS 문서.
- 파일 읽기와 쓰기,
SORT동사를 이용한 정렬, 서식 있는 보고서 출력을 연습하세요. - 실제 운영 시스템에서 일하고 싶다면 주변 메인프레임 도구(JCL, TSO/ISPF)를 익히세요.
자주 묻는 질문
COBOL은 아직도 쓰이나요?
네. 많은 은행, 보험사, 정부 기관이 핵심 배치와 트랜잭션 처리에 여전히 COBOL 프로그램을 운영하므로, 이를 유지보수하고 현대화할 수 있는 개발자에 대한 수요가 계속 있습니다.
COBOL은 배우기 어려운가요?
문법은 장황하지만 단순하며 대부분의 초보자는 금방 동작하는 프로그램을 쓸 수 있습니다. 더 어려운 부분은 그 주변의 메인프레임 환경인 JCL, 데이터셋, CICS, Db2입니다.
메인프레임 없이 COBOL을 배울 수 있나요?
네. GnuCOBOL은 Linux, macOS, Windows에서 실행되고 표준 COBOL을 지원하므로, 메인프레임으로 옮기기 전에 일반 컴퓨터에서 언어를 배울 수 있습니다.
COBOL은 왜 십진수를 쓰나요?
금액 같은 업무 데이터는 정확해야 합니다. COBOL은 숫자를 고정된 소수 자릿수의 십진 숫자로 저장하여 이진 부동소수점의 반올림 오류를 피합니다.