제어 흐름

제어 흐름()은 프로그램에서 실행되는 각 구문, 명령어나 함수가 호출되는 순서를 의미한다. 한편 제어흐름(制御흐름)을 알고리즘에 따른 명령문을 처리할 때 관련 장치들이 연속적으로 작동되는 과정으로 정의해본다면 제어문은 주어진 조건의 결괏값에 따라서 프로그램의 수행 순서를 제어하거나 문장들의 수행 횟수를 조정하는 문장을 가리킨다.

범주 
제어 흐름을 나타내는 구문, 곧 제어문들의 종류는 각 프로그램 언어마다 다르나, 구문들의 실행 방식에 따라 분류할 수 있다.
 다른 구문에서 시작 (무조건 분기, 점프)
 어떠한 조건 만족 시 한 구문의 집합을 실행 (조건 분기)
 어떠한 조건이 만족 될 때까지 한 구문의 집합을 실행 (loop 구문)
 현재 실행 구문에서 떨어진 한 구문의 집합을 실행 (서브루틴)
 프로그램 실행을 중단 (무조건 중지)

인터럽트와 신호는 서브루틴과 유사한 방식으로 프로그램 제어의 흐름을 변경시키는 저수준 메커니즘이다. 그러나 프로그램 내부 제어의 흐름에 의해 실행되기보다는 외부 신호나 이벤트에 대한 반응으로 주로 발생한다.

기계어나 어셈블리 언어에서는 제어 흐름 명령은 주로 프로그램 카운터를 수정하는 방식으로 작동된다. 일부 CPU들의 제어 흐름에 관련된 명령은 조건 또는 무조건 분기 명령에서만 가능하다.

한편 에츠허르 데이크스트라는, 구조화 이론에서 모든 프로그래밍은 순차 실행, 조건 분기 그리고 반복 실행의 3개의 제어문 구문 유형으로 기술될 수 있음을 언급하였다.

조건 분기 구문으로는 'if ~ else ~' 조건문이, 반복 실행 구문으로는 'for (~; ~; ~)' 반복문이 여러 프로그래밍 언어에서 주로 사용되고 있으며. 순차적 실행을 위해서 'main()' 함수 같은 특정 초기 실행 함수가 예약되어 있다.

종류

If ... then ... (else)문 
 if (조건문) GOTO label. 조건문을 만족하면 label에 위치한 구문을 수행한다.
 if (조건문) then (구문) (endif). 조건문을 만족하면 해당 구문을 수행한다.
 if (조건문) then (구문1) else (구문2) (endif). 조건문을 만족하면 구문 1을 수행하고, 그렇지 않다면 구문 2를 수행한다.

if (condition) {
 statement1;
} else {
 statement2;
}

for 루프 
조건이 참이 될 때까지 블록 안의 구문을 반복 수행한다.
for (i = 1; i < goal; i++) {
 statement;
}

switch case문 
명시된 값에 해당하는 case절로 이동하여 해당하는 구문을 수행한다. 해당되는 case가 없을 때 default절을 수행한다.
switch (value) {
 case '1': statement1; break;
 case '2': statement2; break;
 case '3': statement3; break;
 default: statementD;
}

while문 
조건문을 더 이상 만족하지 않을 때까지 블록 안의 구문을 반복 수행한다.
while (condition) {
 statement;
}

goto 문 
제어 흐름을 해당 label로 옮긴다.
 goto label;

도구 
프로그램에는 위에 나열된 종류의 구문 외에도 제어 흐름과 관련된 많은 구문들이 있다. 또한 프로그램 실행 상의 제어 흐름 또한 무수히 존재한다. 실제로 직접 이러한 프로그램 상의 제어 흐름을 일일이 확인하기는 힘든 일이다. 이러한 소모적인 작업을 대신해 주는 정적 분석 도구들을 사용한다면 사람이 직접 분석을 할 때의 시간 및 노력을 절약할 수 있다.

같이 보기 
 연산자 (프로그래밍)

각주

외부 링크 
 MDS 테크놀로지 CodeSonar, Static Analysis, Control/Data Analysis
 GrammaTech CodeSonar