기억형 메모리는 COBOL에서 데이터를 저장하고 처리하는 데 사용되는 변수를 정의하는 방식 중 하나입니다. 변수의 이름을 사람이 이해하기 쉬운 형태로 정의하며, 데이터를 표현하고 처리하기 위한 기호적인 이름을 사용합니다. 이는 가독성을 높이고 프로그래머가 코드를 이해하기 쉽도록 도와줍니다.
01 CUSTOMER-NAME PIC X(30). ** 위의 예시에서 CUSTOMER-NAME은 기억형 메모리 변수로, ** 최대 30개의 문자를 저장할 수 있는 문자열을 나타냅니다.
편집형 메모리는 COBOL에서 데이터를 보다 특정한 형식으로 표시하거나 처리하기 위해 사용되는 메모리 형식입니다. 숫자를 특정한 형식에 맞게 표시하거나 날짜, 시간 등의 데이터를 원하는 형태로 표현할 때 사용됩니다. 이는 출력 결과의 서식을 지정하거나 데이터 변환 작업을 수행할 때 유용합니다.
01 AMOUNT PIC 9(5)V99. ** 위의 예시에서 AMOUNT는 편집형 메모리 변수로, ** 소수점 이하 두 자리까지 표시할 수 있는 숫자를 나타냅니다. ** 특정 출력 형식을 지정할 때 ** 이러한 편집형 메모리를 사용할 수 있습니다.
"ADD..TO"는 변수나 필드의 값을 더하는 연산을 의미합니다. 이 연산은 메모리 내의 값을 변경하며, 계산 결과를 변수에 저장합니다.
- ADD 자료1 자료2 ... TO 메모리1 메모리2 ... : 메모리는 모두 기억형이어야 한다. 편집형은 불가능. 자료는 수치형 리터럴 또는 메모리여야 한다. 연산식은 사용 불가능.
01 TOTAL-AMOUNT PIC 9(6)V99 VALUE 0.
01 TRANSACTION-AMOUNT PIC 9(6)V99 VALUE 100.50.
ADD TRANSACTION-AMOUNT TO TOTAL-AMOUNT.
ADD 100 TO X. :
X에 100을 더한다 (X += 100)
ADD A TO X. :
X의 현재 값에 A를 더한다 (X += A).
예를 들어 덧셈 결과가 1234.567이고
X의 PIC 구가 <9999V999>라면 X에 1234.567이 기억되고,
PIC 구가 <999V9>라면 X에 234.5가 기억된다 (Size Overflow가 발생)
"ADD..TO..ROUNDED"는 COBOL 프로그래밍 언어에서 사용되는 연산 구문 중 하나로, 더한 값을 반올림하여 결과를 저장하는 명령입니다. 이 구문은 연산 결과를 소수점 처리할 때 사용됩니다.
- ADD 자료1 자료2 ... TO 메모리1 [ROUNDED] 메모리2 [ROUNDED] ... : 덧셈 결과 수치가 해당 기억장소의 PIC 구에 맞게 반올림된 후 수록된다.
01 TOTAL-AMOUNT PIC 9(6)V99 VALUE 0.
01 TRANSACTION-AMOUNT PIC 9(6)V99 VALUE 100.50.
ADD TRANSACTION-AMOUNT TO TOTAL-AMOUNT ROUNDED.
- 기억장소 | PIC구 | ADD전 기억되어 있는 값
A | 999V99 | 666.66
B | 999V99 | 222.22
X | 999V9 | 111.1
Y | 999 | 111
ADD A TO X.
: X += A만을 수행하여 결과 수치 (777.76) 중
X의 PIC 구(999V9)에 해당하는 777.7만을 X에 수록한다.
ADD A TO X ROUNDED.
: 결과수치 777.76을 X의 PIC 구(999V9)에 맞게
소수점 이하 1자리로 반올림한 777.8을 X에 수록한다.
ADD A TO X ROUNDED Y ROUNDED.
: X += A, Y += A를 수행 -> 777.76, 777.66
X에는 777.8을 수록 (999V9)
Y에는 778을 수록 (999)
ADD A TO X ROUNDED Y.
: X에는 777.8, Y에는 777을 수록
ADD A B TO X ROUNDED Y ROUNDED.
: X += (A + B), Y += (A + B) 을 수행
결과 수치를 X와 Y의 메로리에 맞게 반올림하여 수록
[코드 예시]
IDENTIFICATION DIVISION.
PROGRAM-ID. 06_ROUNDED.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 A PIC S999V9 VALUE 345.6.
77 B PIC S999 VALUE 111.
77 X PIC -999. *> 편집형 기업장소
PROCEDURE DIVISION.
SiJak-P.
ADD A TO B.
MOVE B TO X.
DISPLAY "X : ", X.
MOVE 345.6 TO A.
MOVE 111 TO B.
ADD A TO B ROUNDED.
MOVE B TO X.
DISPLAY "X : ", X.
STOP RUN.
****** 결과 *******
X : 456
X : 457
******************
"ADD..GIVING"는 COBOL 프로그래밍 언어에서 사용되는 연산 구문 중 하나로, 더한 결과를 다른 변수나 필드에 저장하는 명령입니다. 이 구문은 값을 더하고 그 결과를 특정 변수에 저장할 때 사용됩니다.
- ADD 자료1 자료2 GIVING 기억장소1 [ROUNDED] 기억장소2 [ROUNDED]
- TO와 GIVING은 함께 사용할 수 없다.
01 TOTAL-AMOUNT PIC 9(6)V99 VALUE 0.
01 TRANSACTION-AMOUNT PIC 9(6)V99 VALUE 100.50.
01 RESULT-AMOUNT PIC 9(6)V99 VALUE 0.
ADD TRANSACTION-AMOUNT TO TOTAL-AMOUNT GIVING RESULT-AMOUNT.
ADD A B GIVING X.
: A와 B를 더하여 메모리 X에 수록한다(X = A + B).
이 때 반올림은 수행되지 않는다.
메모리 X는 기억형은 물론 편집형도 가능.
ADD A B GIVING X ROUNDED.
: A+B를 X의 PIC 구에 맞게 반올림하여 X에 수록.
ADD A B GIVING X Y
: A+B를 X와 Y에 수록 (X=A+B, Y=A+B).
반올림은 수행되지 않는다.
ADD A B GIVING X ROUNDED Y.
: 위와 같으나 X에는 결과를 반올림하여 수록.
ADD A B GIVING X ROUNDED Y ROUNDED.
: X와 Y에 모두 결과 수치를 반올림하여 수록.
ADD A B TO C D GIVING X Y.
: ERROR. TO와 GIVING은 함께 사용할 수 없다.
"ADD..ON SIZE ERROR"는 COBOL 프로그래밍 언어에서 사용되는 연산 구문 중 하나로, 더한 결과가 변수의 자릿수를 초과할 때 발생하는 자리넘침(size overflow) 오류를 처리하는 방법을 지정하는 명령입니다.
ADD 자료1 자료2 .. TO 기억장소1 [ROUNDED] 기억장소2 [ROUNDED] ... ON SIZE ERROR 명령문.: ADD..TO와 같으나 덧셈 결과를 메모리에 수록하기에는 폭이 큰 경우 (SIZE OVERFLOW 발생 시) 명령문을 실행함.ADD 자료1 자료2 ... GIVING 기억장소1 [ROUNDED] 기억장소2 [ROUNDED]... ON SIZE ERROR 명령문.: ADD..GIVING과 같으나 SIZE OVERFLOW가 발생한 경우에 명령문을 실행.
01 TOTAL-AMOUNT PIC 9(6)V99 VALUE 999999.
01 TRANSACTION-AMOUNT PIC 9(6)V99 VALUE 0.
ADD TRANSACTION-AMOUNT TO TOTAL-AMOUNT ON SIZE ERROR
DISPLAY "Size overflow occurred!".
< 기억장소 A, B >
- 77 A PIC S999V9 VALUE 333.3.
77 B PIC S999V9 VALUE 955.5.ADD A TO B.의 덧셈 결과는 1288.8로 메모리 B에 수록하기에는 폭이 크다 (S999V9의 최대 저장 값은 999.9). 그러므로 그대로 B에 값을 저장하게 되면 사이즈 오버플로우 발생.
ADD A TO X ON SIZE ERROR DISPLAY 'Error!'
: 덧셈 결과 (X += A) 자리넘침이 발생하면
DISPLAY 'Error!'를 발생시키나, 에러가 없다면 덧셈 결과를 X에 저장시킴.
ADD A TO X ROUNDED ON SIZE ERROR DISPLAY 'Error!'
: 위와 같으나 덧셈 결과가 X에 저장될 때
반올림이 수행된다.
ADD A B GIVING ON SIZE ERROR MOVE 0 TO X.
: A+B의 결과를 X에 수록할 때 자리넘침이 발생하면
[MOVE 0 TO X]를 실행시킴 (X=0).
자리넘침이 발생하지 않으면 X=A+B 수록.
ADD A B GIVING X ROUNDED ON SIZE ERROR MOVE 0 TO X.
: 위와 같지만 A+B의 결과를 X에 수록할 때 반올림 수행.
[코드 예시]
IDENTIFICATION DIVISION.
PROGRAM-ID. 06_ROUNDED2.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 A PIC S999V9 VALUE 333.3. *> 변수 A 선언 및 초기값 할당
77 B PIC S999V9 VALUE 555.5. *> 변수 B 선언 및 초기값 할당
77 X PIC -999.9. *> 변수 X 선언
PROCEDURE DIVISION.
SiJak-P.
ADD A TO B ON SIZE ERROR
DISPLAY 'ERROR!'.
MOVE B TO X. *> 변수 B 값을 변수 X에 복사
DISPLAY X. *> 변수 X 값 출력
MOVE 333.3 TO A. *> 변수 A에 새로운 값 333.3 할당
MOVE 955.5 TO B. *> 변수 B에 새로운 값 955.5 할당
ADD A B GIVING X ON SIZE ERROR
DISPLAY 'ERROR!'.
DISPLAY X. *> 변수 X 값 출력
STOP RUN. *> 프로그램 실행 종료
- SUBTRACT 자료1 자료2 .. FROM 기억장소1 [ROUNDED] 기억장소2 [ROUNDED] .. [ON SIZE ERROR 명령문].
- 각 기억장소(반드시 기억형)에서 지정한 각 자료를 모두 뺀다.
- ROUNDED를 지정하면 뺄셈 결과가 메모리에 수록될 때 반올림이 수행됨.
- ON SIZE ERROR를 지정하면 자리넘침이 발생한 경우 지정한 명령문을 실행.
- 자료1, 자료2는 수치형 상수 또는 기억장소 (연산식 사용 불가)
01 BALANCE PIC 9(6)V99 VALUE 1000.50.
01 WITHDRAWAL PIC 9(6)V99 VALUE 200.75.
SUBTRACT WITHDRAWAL FROM BALANCE.
SUBTRACT 100 FROM X.
: X -= 100
SUBTRACT A 100 FROM X.
: X -= (A + 100) // X = X - A - 100
SUBTRACT A B FROM X Y.
: X와 Y에서 모두 A와 B를 뺀다.
X -= (A + B) & Y -= (A + B)
SUBTRACT A FROM X ROUNDED.
: <X-A>를 X에 수록할 때 X의 PIC 구에 맞게 반올림하여 수록.
SUBTRACT A FROM X ON SIZE ERROR DISPLAY 'Error!'.
: <X-A>를 X에 수록할 때 자리넘침이 발생하면
지정한 문장 출력.
- SUBTRACT 자료1 자료2 .. FROM 자료A GIVING
기억장소1 [ROUNDED]
기억장소2 [ROUNDED][ON SIZE ERROR 명령문].
01 BALANCE PIC 9(6)V99 VALUE 1000.50.
01 WITHDRAWAL PIC 9(6)V99 VALUE 200.75.
01 NEW-BALANCE PIC 9(6)V99 VALUE 0.
SUBTRACT WITHDRAWAL FROM BALANCE GIVING NEW-BALANCE.
SUBTRACT 100 FROM 300 GIVING X.
: 300-100의 결과인 200을 X에 수록.
SUBTRACT A B FROM C GIVING X.
: C-A-B의 결과를 X에 수록.
연산이 수행된 후에 C값은 변화하지 않고 원래 값을 유지함.
SUBTRACT A B FROM C GIVING X Y.
: C-A-B의 결과를 X와 Y 각각에 모두 수록한다.
SUBTRACT A B FROM C GIVING X ROUNDED Y ROUNDED.
: 위와 같으나 X와 Y에 수록할 때 뺄셈 결과를
X와 Y의 PIC 구에 맞게 반올림하여 수록함.
SUBTRACT A FROM B GIVING X ON SIZE ERROR MOVE 0 TO X.
: <B-A>를 수록하기에 자리넘침이 발생하는 경우에
<MOVE 0 TO X>를 실행. 즉 X에 0을 수록.
B는 원래의 값을 그대로 유지한다.
[코드 예시]
IDENTIFICATION DIVISION.
PROGRAM-ID. 06_SUBTRACTION.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 A PIC 9(4) VALUE 1000.
77 B PIC 9(4) VALUE 500.
77 RESULT PIC 9(5) VALUE 0.
PROCEDURE DIVISION.
SiJak-P.
SUBTRACT B FROM A GIVING RESULT. *> B에서 A를 뺀 결과를 RESULT에 저장
DISPLAY 'Subtraction Result: ' RESULT.
STOP RUN. *> 프로그램 실행 종료
- MULTIPLY 자료 BY 기억장소1 [ROUNDED] 기억장소2 [ROUNDED].. [ON SIZE ERROR 명령문].
- 기억장소1, 기억장소2..의 값에 자료를 곱하여 그 결과를 기억장소(메모리)에 수록한다.
- 자료는 수치 리터럴 혹은 기억장소이다.
- 기억장소1, 2는 반드시 기억형이어야 한다. 편집형은 안된다.
01 QUANTITY PIC 9(4) VALUE 10.
01 PRICE PIC 9(6)V99 VALUE 25.75.
MULTIPLY QUANTITY BY PRICE.
MULTIPLY 5 BY A.
: A *= 5
MULTIPLY 5 BY ROUNDED.
: 위와 같으나 곱셈 결과를 A의 PIC 구에 맞게 반올림 후
A에 수록한다.
MULTIPLY A BY X Y.
: X*A를 X에, Y*A를 Y에 수록.
X *= A & Y *= A.
MULTIPLY A BY B ON SIZE ERROR MOVE 1 TO Flag.
: A*B를 계산하여 B에 수록하되,
자리넘침이 발생하는 경우에는 MOVE 1 TO Flag를 수행.
B는 원래 값을 그대로 유지한다.
- MULTIPLY 자료A BY 자료B GIVING 기억장소1 [ROUNDED] 기억장소2 [ROUNDED]... [ON SIZE ERROR 명령문].
- 자료A X 자료B 를 기억장소1, 기억장소2..에 수록한다.
- 자료A, 자료B는 수치 리터럴 혹은 기억장소다.
- 기억장소1, 기억장소2..는 기억형은 물론 편집형도 가능.
01 QUANTITY PIC 9(4) VALUE 10.
01 PRICE PIC 9(6)V99 VALUE 25.75.
01 TOTAL-AMOUNT PIC 9(8)V99 VALUE 0.
MULTIPLY QUANTITY BY PRICE GIVING TOTAL-AMOUNT.
MULTIPLY 3 BY 5 GIVING X.
: X = 3*5
MULTIPLY A BY B GIVING X.
: X = A*B
MULTIBLY A BY B GIVING X Y.
: X = A*B & Y = A*B
MULTIPLY A BY B GIVING X ON SIZE ERROR MOVE 0 TO X.
: A*B를 X에 수록하되
자리넘침이 발생하면 X에 0을 수록.
- DIVIDE 자료 INTO 기억장소1 [ROUNDED] 기억장소2 [ROUNDED].. [ON SIZE ERROR 명령문].
- 각 메모리의 값을 <자료>로 나누어 그 결과를 각 메모리에 수록한다.
- 자료는 수치 리터럴 또는 기억형(기억장소)이다.
- 기억장소1, 2는 반드시 기억형이어야 한다. 편집형 불가.
01 TOTAL-SALE PIC 9(8)V99 VALUE 1000.50.
01 QUANTITY-SOLD PIC 9(4) VALUE 25.
01 AVERAGE-PRICE PIC 9(6)V99 VALUE 0.
DIVIDE TOTAL-SALE INTO QUANTITY-SOLD GIVING AVERAGE-PRICE.
DIVIDE 10 INTO A.
: A ÷= 10
DIVIDE A INTO X Y.
: X ÷= A & Y ÷= A
DIVIDE A INTO X ROUNDED Y ROUNDED.
: 위와 같으나 나눗셈 결과를 X, Y에 수록할 때
X와 Y의 PIC 구에 맞게 반올림 후 수록한다.
DIVIDE 0.01 INTO A ON SIZE ERROR MOVE 1 TO Flag.
: A ÷ 0.01의 결과를 A에 수록할 수 없을 때에
A는 원래 값을 유지하고 Flag에 1을 수록한다.
- DIVIDE 자료A INTO(BY) 자료B GIVING 기억장소1 [ROUNDED][REMAINDER 기억장소2] [ON SIZE ERROR 명령문].
- 자료B ÷ 자료A (INTO) or 자료A ÷ 자료B (BY) 를 계산하여 그 몫을 기억장소1에 나머지를 기억장소2에 수록.
- 자료A, B는 수치 리터럴 또는 기억장소다.
- 기억장소1, 2는 기억형은 물론 편집형도 가능하다.
01 TOTAL-SALE PIC 9(8)V99 VALUE 1000.50.
01 QUANTITY-SOLD PIC 9(4) VALUE 25.
01 AVERAGE-PRICE PIC 9(6)V99 VALUE 0.
DIVIDE TOTAL-SALE INTO QUANTITY-SOLD GIVING AVERAGE-PRICE.
DIVIDE 10 INTO A GIVING X.
: A ÷ 10의 몫만을 X에 수록한다.
A는 원래의 값을 그대로 유지한다.
DIVIDE B INTO A GIVING X REMAINDER Y.
: A÷B의 몫은 X에, 나머지는 Y에 수록.
A는 원래의 값을 그대로 유지한다.
DIVIDE B INTO A GIVING X ROUNDED REMAINDER Y.
: 위와 같으나 X에 수록할 때는 반올림하여 수록한다.
DIVIDE B BY A GIVING X.
: B÷A의 몫을 X에 수록한다.
DIVIDE B BY A GIVING X REMAINDER Y.
: B÷A의 몫을 X에, 나머지를 Y에 수록한다.
- COMPUTE 기억장소 [ROUNDED] = 연산식
[ON SIZE ERROR 명령문].- 연산식의 결과를 기억장소에 수록한다.
- 연산식은 기억장소, 리터럴, 수식 모두 가능하다.
- 기억장소는 기억형은 물론 편집형도 가능하다.
COMPUTE A = 100.
: A에 100을 수록한다.
<MOVE 100 TO A.> 와 동일.
COMPUTE A = A + B.
: A + B를 A에 수록.
<ADD B TO A.> 와 동일.
COMPUTE A ROUNDED = A + B.
: 위와 같으나 A + B의 결과를 A의 PIC 구에 맞게
반올림한 후 A에 수록한다.
<ADD B TO A ROUNDED.>와 동일.
COMPUTE X = A * b ON SIZE ERROR MOVE 0 TO X.
: A*B를 X에 수록하되 자리넘침이 발생하면 X에 0을 수록.
<MULTIPLY A BY B GIVING X ON SIZE ERROR MOVE 0 TO X.>
** : 거듭제곱* : 곱셈/ : 나눗셈+ : 덧셈- : 뺄셈주의사항
- 연산자 좌우에는 반드시 공란을 띄워야 한다.
- 연산자의 처리순서에 주의.
- 메모리에 수록될 때는 해당 PIC 구에 해당하는 숫자부분만 수록된다. ROUNDED의 경우는 반올림 후 수록된다.
[코드 예시]
IDENTIFICATION DIVISION.
PROGRAM-ID. 06_COMPUTE.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 A PIC 9(4) VALUE 100.
77 B PIC 9(4) VALUE 50.
77 C PIC 9(5) VALUE 0.
PROCEDURE DIVISION.
SiJak-P.
COMPUTE C = A + B. *> A와 B를 더한 결과를 변수 C에 저장
DISPLAY 'Addition Result: ' C.
COMPUTE C = A - B. *> A에서 B를 뺀 결과를 변수 C에 저장
DISPLAY 'Subtraction Result: ' C.
COMPUTE C = A * B. *> A와 B를 곱한 결과를 변수 C에 저장
DISPLAY 'Multiplication Result: ' C.
COMPUTE C = A / B. *> A를 B로 나눈 결과를 변수 C에 저장
DISPLAY 'Division Result: ' C.
STOP RUN. *> 프로그램 실행 종료
***** 실행결과
***** Addition Result: 150
***** Subtraction Result: 50
***** Multiplication Result: 5000
***** Division Result: 2
좋은 정보 얻어갑니다, 감사합니다.