논리 제어 반복문

조건이 처음부터 거짓이면, 본체는 몇 번 실행될까?

논리 제어 반복문

세지 않고 조건으로 돕니다

논리 제어 반복문(logically-controlled loop)은 세는 변수가 아니라 불리언 식의 참·거짓으로 되풀이를 제어합니다. 조건이 참인 동안 돌고, 거짓이 되면 끝납니다.

본체는 되풀이되는 문장들입니다. ①은 다음 카드에서 봅니다. ②는 언어 설계자가 정할 일입니다. 참·거짓의 순서는 예시입니다.

검사하는 자리

본체 앞에서 볼까, 뒤에서 볼까

조건을 본체 앞에서 검사하면 사전 검사(pretest), 본체 뒤에서 검사하면 사후 검사(posttest)입니다. C와 C++은 둘 다 있습니다. while이 사전 검사이고 do-while이 사후 검사입니다.

while (조건) 본체, 그리고 do 본체 while (조건); 의 꼴로 씁니다.

처음부터 거짓이면

0번과 1번으로 갈립니다

조건이 처음부터 거짓일 때 차이가 드러납니다. 사전 검사는 본체를 한 번도 실행하지 않습니다. 사후 검사는 본체를 먼저 실행하고 나서 검사하므로 적어도 한 번은 실행합니다.

F#에서는 6편의 forLoop처럼 재귀 함수로 사전 검사 반복을 만듭니다. 조건 함수가 참이면 본체 함수를 실행하고 자기 자신을 다시 부릅니다.

C, C++과 Java

본체 중간으로 들어갈 수 있을까

C와 C++은 조건에 산술 식을 쓸 수 있고, 본체의 중간으로 분기해 들어가는 것도 허용합니다. Java는 조건이 불리언이어야 하고, 본체에는 처음으로만 들어갈 수 있습니다. goto가 없기 때문입니다.

분기는 실행 위치를 다른 곳으로 옮기는 것이고, goto는 그렇게 하는 문장입니다(9편).

사용자 지정 반복 제어

break는 고리 밖으로 나갑니다

반복을 처음이나 끝이 아니라 본체 한가운데에서 제어하는 것이 사용자 지정 반복 제어(user-located loop control)입니다. break는 그 자리에서 반복문을 빠져나갑니다. C, C++, Python, Ruby, C#에 있습니다.

설계에서는 빠져나갈 때 조건을 달 수 있는지도 정합니다. found가 둘째 바퀴에서 참이 되는 예시입니다.

continue

continue는 고리 머리로 돌아갑니다

continue는 이번 바퀴의 남은 부분만 건너뛰고 다음 바퀴로 넘어갑니다. 반복문 자체를 빠져나가지는 않습니다. C, C++, Python에 있습니다.

skip이 첫 바퀴에서만 참인 예시입니다.

겹친 반복문

레이블을 붙이면 여러 겹을 나갑니다

그냥 break는 가장 안쪽 반복문 하나만 빠져나갑니다. Java의 break와 Perl의 last는 레이블을 붙여 바깥 반복문까지 한 번에 나갑니다.

레이블은 문장 앞에 붙인 이름입니다. 여러 겹을 한 번에 나갈 수 있느냐가 설계 쟁점입니다. Java의 continue와 Perl의 next에도 레이블을 붙일 수 있습니다.

다음 편

횟수도 조건도 아니고, 배열이나 리스트에 든 요소 수만큼 도는 반복이 있습니다

8편다음 요소는 누가 꺼내 줄까? 7강 목록