사람이 쉽게 처리하기 어려운 방대한 양의 반복 작업을 컴퓨터는 매우 손쉽게, 그리고 매우 빠르게 처리할 수 있습니다.
물론 여기에는 조건이 붙습니다. 컴퓨터가 이해할 수 있게끔 아주 명확하게 일을 지시해야 한다는 것입니다.
괄호가 하나 둘 누락된 것쯤이야 컴퓨터가 피드백을 준다지만, 내가 무엇을 어떻게 작성해야 할 지 모를 때만큼 난감한 일도 없습니다. 이중 반복문에 사이사이 조건문까지 작성하려니 처음으로 머리에 쥐가 다 나는 것 같더라구요.
지식이란 설명할 수 있어야 비로소 습득한 것이라는 말이 있던가요. 최대한 나름의 방식으로 설명해서 반복문 지옥을 이겨내볼까 합니다.
for (let i = 0; i < 5; i++) {
for (let j = 0; j < 5; j++) {
반복할 내용 1
}
}
위의 for 문에서 과연 ‘반복할 내용 1’ 은 몇 번 반복될까요? 네 25번입니다. i를 반복 변수로 하는 조건문이 5번, 근데 i 가 한번 반복될 때마다 다시 그 안에서 j를 반복 변수로 하는 반복문이 5번 반복되어 총 25회가 반복되는 것이죠.
언뜻 봐도 5번씩 5번 반복되어 보이시나요? 그렇다면 다음 반복문은 어떨까요?
for (let i = 0; i < 5; i++) {
for (let j = 0; j < i; j++) {
반복할 내용 2
}
}
얼핏 봐서는 횟수를 알기가 쉽지 않아보입니다. 실제로 어떻게 돌아가는지를 보기 위해 횟수를 셀 수 있는 변수 count를 선언하고 횟수를 체크할 수 있도록 바꿔보겠습니다.
let count = 0;
for (let i = 0; i < 5; i++) {
for (let j = 0; j < i; j++) {
count = count + 1;
}
}
크롬 개발자 도구에서 확인해보니 10이라고 나오네요. 사실 언뜻 계산했을 때는 1+2+3+4+5=15 라는 값을 기대했었습니다. i = 0; i < 5 일 때, i 는 총 5번 반복되니까, j < i 에도 5가 들어갈 거라고 생각한 거죠.
하지만 결과는 1+2+3+4=10 이라는 결과값이 나오는 것을 알 수 있었습니다. i 는 0,1,2,3,4 의 순서로 5번 반복되지만 내부의 j반복문에는 최종적으로 4라는 조건으로 넘어가고 그래서 j 반복문이 0,1,2,3 이렇게 4번만 반복되기 때문입니다.
언뜻 이해하기 쉽지 않은 내용이라 다음의 글에서 차근차근 짚어보도록 하겠습니다. for 반복문은 다음과 같은 순서로 실행됩니다.
for ([초기문]; [조건문]; [증감문]) {
문장
}
앞선 2중 반복문을 보면 첫 반복문(이하 i 반복문)에서 반복변수로 i 가 선언되고 0이 할당되었습니다. 할당된 0 이라는 값은 i < 5 라고 하는 조건에 부합하기 때문에 참이 되어 i 반복문 내의 문장을 실행하게 되죠. (i = 0)
그런데 그 안에 다시 반복문이 있네요? j 를 반복변수로 하는 반복문(이하 j 반복문)이 실행됩니다. 초기문은 잘 넘어갔는데 조건문에서 i < j 라고 하는 조건이 성립되지 않습니다. i = 0, j = 0, 둘 다 0이니 0 < 0 은 거짓이 되어 반복문이 종결된 것이죠.
안쪽의 j 반복문은 종결되었지만, 여전히 바깥의 i 반복문이 살아있는 상태입니다. i++이라고 하는 증감문이 실행되고 i = 1 이 되어 다시 반복을 시작하게 되죠. i 의 증가는 j 반복문의 조건에만 영향을 미치기 때문에, j 반복문은 0에서부터 새롭게 시작됩니다.
이번에는 0 ( j ) < 1 ( i ) 이 되어 조건을 충족하게 되면서 j 반복문이 실행됩니다. 그리고 실행이 끝난 뒤 j++ 를 만나 j = 1 을 할당한 후, 1 (j) < 1 (i) = false 이기 때문에 1 번을 끝으로 j 반복문이 종료됩니다.
이런 순서대로 반복되다 보면 바깥쪽의 i 반복문이 5번 반복되는 동안 안쪽의 반복문은 그것보다 1번 적은 4번 반복되고, 그렇게 총 10회를 반복하게 됩니다. 그렇게 앞서 확인한 10회를 검증할 수 있게 되죠.
반복문의 구조와 순서를 이해하게 되면 초기문/조건문/증감문을 적절히 설정하여 원하는 결과를 도출할 수 있게 됩니다. 논리의 순서를 따라가는 일이 쉽지는 않지만, 차근차근 생각해보면 조금 더 수월하게 이해할 수 있는 것 같네요.