Cobol 문법 (5) : 제어문 등

yoneeki·2023년 8월 9일

cobolGrmr

목록 보기
5/11

제어문

  • 코볼 프로그램의 실행을 흐름을 제어하는 문.

    제어문(Control Statements)은 프로그램의 실행 흐름을 조작하고 제어하는 데 사용되는 문장들을 의미합니다. COBOL 프로그래밍에서 제어문은 프로그램의 논리적인 분기, 조건 처리, 반복 등을 가능하게 하며, 프로그램의 실행 흐름을 결정하는 중요한 요소입니다.

  • 종류
    ◼ GO TO (실행 분기)와 STOP (실행 정지/종료)
    ◼ IF (조건 만족 여부에 따라 <다른 처리>를 수행)
    ◼ PERFORM (프로시저 실행)
    ◼ CALL (다른 프로그램을 실행)

[코드 예시]

       IDENTIFICATION            DIVISION.
       PROGRAM-ID.               06_CONTROL_STATEMENTS.

       DATA                      DIVISION.
       WORKING-STORAGE           SECTION.
       01  AGE                   PIC 99 VALUE 18.

       PROCEDURE                 DIVISION.
       SiJak-P.
           DISPLAY 'Starting program execution...'.

           *> GO TO 문: 실행 분기
           IF AGE LESS THAN 20
               DISPLAY 'Age is less than 20. Jumping to label YOUNG.'.
               GO TO YOUNG.
           END-IF.

           DISPLAY 'Age is 20 or more. Continuing execution...'.

       YOUNG.
           DISPLAY 'Inside YOUNG label block. Age is less than 20.'.

           *> IF 문: 조건 처리
           IF AGE GREATER THAN 10
               DISPLAY 'Age is greater than 10.'.
           ELSE
               DISPLAY 'Age is not greater than 10.'.
           END-IF.

           *> PERFORM 문: 프로시저 실행
           PERFORM DISPLAY_AGE 3 TIMES.

           *> CALL 문: 다른 프로그램 실행
           CALL 'ANOTHER-PROGRAM'.

           STOP RUN.

       DISPLAY_AGE.
           DISPLAY 'Current age: ' AGE.

       ANOTHER-PROGRAM.
           DISPLAY 'Executing ANOTHER-PROGRAM...'.

           STOP RUN.

****** 결과 *******
Starting program execution...
Age is less than 20. Jumping to label YOUNG.
Inside YOUNG label block. Age is less than 20.
Age is greater than 10.
Current age: 18
Current age: 18
Current age: 18
Executing ANOTHER-PROGRAM...
******************

GO TO와 STOP

GO TO 문은 프로그램의 특정 레이블로 실행을 분기시킵니다. 이는 프로그램 흐름을 끊어내기 때문에 사용을 권장하지 않습니다.
STOP 문은 프로그램을 정지하거나 종료합니다. STOP RUN은 프로그램 실행을 정상적으로 종료하며, STOP은 실행을 중단합니다.

GO TO

  • GO TO 프로시저
  • 프로그램의 실행을 무조건 지정한 프로시저로 이동/분기(Branch)시킨다.

GO TO DEPENDING ON

  • GO TO 프로시저1, 프로시저2 .. 프로시저n DEPENDING ON 기억장소
  • 메모리 값에 따라 서로 다른 처리를 수행할 때 사용됨.
IDENTIFICATION            DIVISION.
PROGRAM-ID.               06_GO_TO_DEPENDING_ON.

DATA                      DIVISION.
WORKING-STORAGE           SECTION.
01  CHOICE                PIC 9 VALUE 2.  *> CHOICE 변수 선언 및 초기화

PROCEDURE                 DIVISION.
SiJak-P.
    DISPLAY 'Starting program execution...'.

    GO TO DEPENDING-ON-CHOICE.  *> DEPENDING-ON-CHOICE 레이블로 이동

DEPENDING-ON-CHOICE.
    DISPLAY 'Inside DEPENDING-ON-CHOICE label block.'.

    *> GO TO DEPENDING ON 문: 조건에 따른 분기
    GO TO LABEL-1      DEPENDING ON CHOICE
               LABEL-2
               LABEL-3.

LABEL-1.
    DISPLAY 'Inside LABEL-1 block. Choice: 1.'.
    GO TO END-PROGRAM.  *> 프로그램 종료로 분기

LABEL-2.
    DISPLAY 'Inside LABEL-2 block. Choice: 2.'.
    GO TO END-PROGRAM.  *> 프로그램 종료로 분기

LABEL-3.
    DISPLAY 'Inside LABEL-3 block. Choice: 3.'.

END-PROGRAM.
    DISPLAY 'Program execution completed.'.

    STOP RUN.


******* 결과 ********
Starting program execution...
Inside DEPENDING-ON-CHOICE label block.
Inside LABEL-2 block. Choice: 2.
Program execution completed.
********************

DEPENDING ON과 위치 식별 변수(?)

  1. DEPENDING ON 문법
  • DEPENDING ON 문법은 COBOL 프로그램에서 조건에 따라 다른 레이블로 분기할 수 있도록 하는 기능입니다.
  • 이 기능은 반복적인 작업이나 선택 사항 처리 등에 유용하게 사용될 수 있습니다.
  • 특정 변수의 값에 따라 분기할 레이블을 지정하여 프로그램의 흐름을 제어합니다.
  1. 레이블 (Label)
  • 레이블은 프로그램 내에서 특정 위치를 식별하는 데 사용되는 이름입니다. 주로 코드 블록의 시작 지점을 가리키는 역할을 합니다.
  • 레이블은 일반적으로 숫자, 알파벳, 그리고 하이픈 등의 문자로 구성됩니다.
  • LABEL-1, LABEL-2와 같은 형식으로 정의될 수 있습니다.

꼭 LABEL이어야 하나

  • 레이블(label) 대신 다른 이름을 사용할 수 있습니다. COBOL에서 GO TO DEPENDING ON 문법을 사용할 때, 분기할 목표를 가리키는 레이블 이름으로 어떤 유효한 식별자든 사용할 수 있습니다.
01  CHOICE                PIC 9 VALUE 2.

DEPENDING-ON-CHOICE.
    GO TO OPTION-1 DEPENDING ON CHOICE
               OPTION-2
               OPTION-3.

OPTION-1.
    DISPLAY 'Inside OPTION-1 block. Choice: 1.'.
    GO TO END-PROGRAM.

OPTION-2.
    DISPLAY 'Inside OPTION-2 block. Choice: 2.'.
    GO TO END-PROGRAM.

OPTION-3.
    DISPLAY 'Inside OPTION-3 block. Choice: 3.'.

END-PROGRAM.
    DISPLAY 'Program execution completed.'.
    STOP RUN.

ALTER

  • 프로시저명을 재설정
    • ALTER 프로시저1 TO [PROCEED TO] 프로시저2.
    • 명칭 프로시저1을 프로시저2로 재설정. GO TO 문과 함께 사용.

[코드 예시]

       IDENTIFICATION            DIVISION.
       PROGRAM-ID.               06_ALTER_PROCEDURE.

       DATA                      DIVISION.
       WORKING-STORAGE           SECTION.

       PROCEDURE                 DIVISION.
       SiJak-P.
           DISPLAY 'Starting program execution...'.

           PERFORM ORIGINAL-PROCEDURE.

           DISPLAY 'Continuing program execution...'.

           STOP RUN.

       ORIGINAL-PROCEDURE.
           DISPLAY 'Inside ORIGINAL-PROCEDURE.'.
           GO TO ALTERED-PROCEDURE.

       ALTERED-PROCEDURE.
           DISPLAY 'Inside ALTERED-PROCEDURE.'.

           *> ALTER 문: 프로시저명 변경
           ALTER ORIGINAL-PROCEDURE TO PROCEDURE-AFTER-ALTER.

       PROCEDURE-AFTER-ALTER.
           DISPLAY 'Inside PROCEDURE-AFTER-ALTER.'.

       END-PROGRAM.
           DISPLAY 'Program execution completed.'.

IF

IF 문은 조건을 평가하고, 조건이 참일 경우에만 특정한 코드 블록을 실행합니다. IF ... ELSE ... END-IF 구문을 사용하여 조건에 따라 두 가지 다른 실행 경로를 만들 수 있습니다.

[코드 예시]

       IDENTIFICATION            DIVISION.
       PROGRAM-ID.               06_IF_STATEMENT.

       DATA                      DIVISION.
       WORKING-STORAGE           SECTION.
       01  AGE                   PIC 99 VALUE 25.

       PROCEDURE                 DIVISION.
       SiJak-P.
           DISPLAY 'Starting program execution...'.

           *> IF 문: 조건에 따른 실행 경로 결정
           IF AGE LESS THAN 20
               DISPLAY 'Age is less than 20.'.
           ELSE
               DISPLAY 'Age is 20 or more.'.
           END-IF.

           DISPLAY 'Continuing program execution...'.

           STOP RUN.
           
****** 결과 ******
Starting program execution...
Age is 20 or more.
Continuing program execution...
*****************

PERFORM

COBOL의 PERFORM 문은 프로그램 내에서 특정한 작업 단위나 프로시저를 반복적으로 실행하는 제어문입니다. 이를 통해 코드의 재사용성을 높이고 반복적인 작업을 간단하게 처리할 수 있습니다.

[구조]

PERFORM procedure-name [UNTIL condition]

[코드 예시]

       IDENTIFICATION            DIVISION.
       PROGRAM-ID.               06_PERFORM_STATEMENT.

       DATA                      DIVISION.
       WORKING-STORAGE           SECTION.
       01  COUNTER               PIC 99 VALUE 1.

       PROCEDURE                 DIVISION.
       SiJak-P.
           DISPLAY 'Starting program execution...'.

           *> PERFORM 문: 프로시저를 반복적으로 실행
           PERFORM DISPLAY-COUNTER UNTIL COUNTER GREATER THAN 5.

           DISPLAY 'Continuing program execution...'.

           STOP RUN.

       DISPLAY-COUNTER.
           DISPLAY 'Counter value: ' COUNTER.
           ADD 1 TO COUNTER.

******* 결과 *******
Starting program execution...
Counter value: 1
Counter value: 2
Counter value: 3
Counter value: 4
Counter value: 5
Continuing program execution...
********************

//이 예시에서는 DISPLAY-COUNTER 프로시저가 
//PERFORM 문을 통해 1부터 5까지의 값을 출력하며 반복 실행

CALL & PERFORM

  • 메서드(서브루틴)는 프로그램의 일부를 모듈화하고 재사용성을 높이기 위한 코드 블록을 나타내며, CALL을 사용하여 호출할 수 있습니다.
  • 반면에 PERFORM PROCEDURE는 서브루틴을 호출하고 실행하는 데 사용되는 특별한 COBOL 키워드입니다.

CALL과 PERFORM의 차이

CALL은 일반적인 서브루틴 호출에 사용되며, 호출된 서브루틴이 실행을 완료한 후에 호출한 곳으로 돌아옵니다. 반면에 PERFORM은 반복 작업이나 루프를 수행하는 데 사용되며, 호출된 서브루틴이 실행 중에는 호출한 곳으로 돌아가지 않습니다.

  1. CALL:
  • CALL은 COBOL에서 서브루틴을 호출하는 키워드입니다.

  • CALL을 사용하여 다른 프로시저(서브루틴)를 호출하면, 호출된 서브루틴이 실행을 완료한 후에 호출한 곳으로 돌아옵니다.

  • 호출한 곳에서는 CALL 이후의 코드가 실행됩니다.

    		IDENTIFICATION DIVISION.
    		PROGRAM-ID. MYPROGRAM.
    
    		PROCEDURE DIVISION.
              CALL MY-SUBROUTINE.
              DISPLAY 'Back in main program after calling MY-SUBROUTINE.'.
              STOP RUN.
    
    		MY-SUBROUTINE.
      		DISPLAY 'Inside MY-SUBROUTINE.'.
      .
    
  1. PERFORM:
  • PERFORM은 COBOL에서도 서브루틴을 호출하는 데 사용되지만, 일반적으로 반복적인 작업을 수행하기 위해 사용됩니다.

  • PERFORM을 사용하여 서브루틴을 호출하면, 호출된 서브루틴이 실행 중에는 호출한 곳으로 돌아가지 않습니다. 서브루틴 실행이 끝날 때까지 제어가 넘어가지 않습니다.

  • PERFORM을 사용하여 반복 작업이나 특정 프로시저를 실행하면, 해당 프로시저가 모두 실행될 때까지 루프를 돕니다.

      IDENTIFICATION DIVISION.
       PROGRAM-ID. MYPROGRAM.
    
    	PROCEDURE DIVISION.
      	  	PERFORM 3 TIMES
           		 DISPLAY 'Inside PERFORM loop.'.
        	DISPLAY 'Loop finished.'.
        	STOP RUN.
    

메서드 / 서브루틴 / 프로시저

  • COBOL에서는 '메서드'라는 용어보다 '서브루틴'이나 '프로시저'라는 용어를 더 일반적으로 사용합니다.
  • 메서드(서브루틴)는 일련의 작업을 수행하는 코드 블록을 나타냅니다.
  • 메서드는 프로그램 내에서 필요할 때 호출되며, 코드 중복을 줄이고 재사용성을 높이는 데 사용됩니다.
  • 서브루틴은 프로그램의 주요 기능을 모듈화하여 프로그램의 가독성과 유지보수를 쉽게 할 수 있게 합니다.
  • 서브루틴 호출은 CALL이라는 키워드를 사용합니다.
IDENTIFICATION DIVISION.
PROGRAM-ID. MYPROGRAM.

PROCEDURE DIVISION.
    CALL MY-SUBROUTINE.
    DISPLAY 'Program execution completed.'.
    STOP RUN.

MY-SUBROUTINE.
    DISPLAY 'Inside MY-SUBROUTINE.'.
    .

PERFORM

  • PERFORM PROCEDURE는 COBOL에서 서브루틴을 호출하는 방법 중 하나입니다.
  • PERFORM은 특정 프로시저(서브루틴)를 실행하도록 지시하는 키워드입니다.
  • PERFORM PROCEDURE 문법은 서브루틴을 실행하고, 해당 서브루틴이 끝날 때까지 제어가 돌아가지 않습니다. 즉, 서브루틴의 실행이 완료되어야 원래 위치로 돌아갑니다.
  • 이것은 서브루틴을 호출하는 것과 유사한 역할을 하지만, PERFORM PROCEDURE는 조금 더 간결한 문법을 제공합니다.
IDENTIFICATION DIVISION.
PROGRAM-ID. MYPROGRAM.

PROCEDURE DIVISION.
    PERFORM MY-SUBROUTINE.
    DISPLAY 'Program execution completed.'.
    STOP RUN.

MY-SUBROUTINE.
    DISPLAY 'Inside MY-SUBROUTINE.'.
    .

CALL

COBOL의 CALL 문은 다른 프로그램을 실행하거나 서브루틴을 호출하는 데 사용되는 제어문입니다. 이를 통해 여러 개의 프로그램이나 서브루틴 간에 상호작용할 수 있습니다. CALL 문은 주로 다른 COBOL 프로그램을 호출하거나, 외부 서브루틴을 실행하는데 사용됩니다.

[구조]

CALL program-name [USING data-items]

[코드 예시]

       IDENTIFICATION            DIVISION.
       PROGRAM-ID.               06_CALL_STATEMENT.

       DATA                      DIVISION.
       WORKING-STORAGE           SECTION.
       01  VALUE-A               PIC 9 VALUE 10.
       01  VALUE-B               PIC 9 VALUE 5.
       01  RESULT                PIC 9.

       PROCEDURE                 DIVISION.
       SiJak-P.
           DISPLAY 'Starting program execution...'.

           *> CALL 문: 다른 프로그램 호출
           CALL 'CALCULATION-PROGRAM' USING VALUE-A VALUE-B GIVING RESULT.

           DISPLAY 'Result: ' RESULT.
           DISPLAY 'Continuing program execution...'.

           STOP RUN.
           
******* 결과 *******
Starting program execution...
Result: 15
Continuing program execution...
*******************

//이 예시에서는 'CALCULATION-PROGRAM'이라는 
//다른 프로그램을 CALL 문으로 호출하고, 
//USING 절을 사용하여 VALUE-A와 VALUE-B 값을 전달. 
//호출된 프로그램은 전달받은 값을 더한 결과를 GIVING 절을 통해
//RESULT 변수에 저장하고, 결과를 출력.
profile
Working Abroad ...

0개의 댓글