하리Hari

8. 반복문 (반복하자)

같은 일을 여러 번, 또는 묶음의 값마다 반복해요.

이 장에서 배울 것

  • 정해진 횟수만큼 반복하기 (1부터 N까지 반복하자)
  • 목록·사전·글자의 값마다 반복하기 (마다 반복하자)
  • 조건이 참인 동안 반복하기 (동안 반복하자)
  • 반복을 중간에 끝내기, 합계 구하기 같은 자주 쓰는 모양

“안녕”을 100번 출력하려고 출력 줄을 100번 쓸 수는 없겠죠? 반복문은 같은 일을 여러 번 하게 해 줘요. 하리의 반복문은 세 가지예요.

반복문 언제 예
1부터 N까지 반복하자 ('횟수'): 횟수가 정해져 있을 때 1부터 10까지 세기
'목록'의 '값'마다 반복하자: 묶음의 값을 하나씩 다룰 때 모든 학생의 점수 출력
(조건)인 동안 반복하자: 언제 끝날지 조건으로 정할 때 에너지가 0이 될 때까지

정해진 횟수만큼

1부터 3까지 반복하자 ('횟수'):
    틀"{'횟수'}번째 인사: 안녕!"을 출력하자
"끝"을 출력하자
  1. '횟수'에 1이 담기고, 들여 쓴 묶음을 실행해요.
  2. '횟수'에 2가 담기고, 다시 실행해요.
  3. '횟수'에 3이 담기고, 다시 실행해요.
  4. 3까지 했으니 반복을 끝내고 끝을 출력해요.

괄호 안의 '횟수'는 지금 몇 번째인지 담기는 이름표예요. 이름은 마음대로 지어도 돼요('i', '번호' …). 끝 숫자도 포함이라서 1부터 3까지는 세 번 돌아요.

시작이 끝보다 크면 하나씩 줄어들며 돌아요.

3부터 1까지 반복하자 ('수'):
    '수'를 출력하자
"발사!"를 출력하자

시작과 끝에는 숫자뿐 아니라 이름표나 계산식도 쓸 수 있어요.

'개수'를 4로 정하자
1부터 '개수'까지 반복하자 ('i'):
    틀"{'i'} x 2 = {'i' * 2}"를 출력하자

자주 쓰는 모양: 모두 더하기

반복하면서 값을 쌓아 가는 모양은 정말 자주 써요. 반복 앞에 담을 이름표를 0으로 만들어 두고, 안에서 더해요.

'합'을 0으로 정하자

1부터 10까지 반복하자 ('수'):
    '합'에 '수'를 더하자

틀"1부터 10까지의 합: {'합'}"을 출력하자

55가 나와요. 반복 안에서 '합'을 만들면 안 돼요. 다음의 “반복 안에서 만든 이름표”를 보세요.


묶음의 값마다: 마다 반복하자

목록의 값을 앞에서부터 하나씩 꺼내 반복해요.

'과일들'을 ["사과", "바나나", "포도"]로 정하자

'과일들'의 '과일'마다 반복하자:
    틀"맛있는 {'과일'}!"을 출력하자

'과일'에 "사과", "바나나", "포도"가 차례로 담겨요. 번째를 셀 필요가 없어서 편해요.

사전은 마다 반복하자로 돌면 키가 하나씩 나와요. 값은 그 키로 꺼내면 돼요.

'점수'를 {"국어": 90, "수학": 80, "영어": 70}으로 정하자

'점수'의 '과목'마다 반복하자:
    틀"{'과목'}: {'점수'의 '과목'}점"을 출력하자

키는 숫자는 작은 것부터, 글자는 가나다·ABC 순서로 나와요.

문자열도 글자를 하나씩 꺼내 돌 수 있어요.

'인사'를 "안녕"으로 정하자

'인사'의 '글자'마다 반복하자:
    틀"글자: {'글자'}"를 출력하자

조건이 참인 동안: 동안 반복하자

(조건)인 동안 반복하자:는 조건이 참인 동안 계속 돌아요. 매번 묶음을 실행하기 전에 조건을 검사해요.

'에너지'를 3으로 정하자

('에너지'가 0보다 크다)인 동안 반복하자:
    틀"에너지 {'에너지'} 남음"을 출력하자
    '에너지'에서 1을 빼자

"에너지가 다 떨어졌어요!"를 출력하자

⚠️ 조건이 언젠가 거짓이 되게 하세요. 위에서 '에너지'에서 1을 빼자를 빠뜨리면 에너지가 줄지 않아 영원히 끝나지 않아요. 반복 안에서 조건에 쓰인 값이 바뀌는지 꼭 확인하세요.

2씩 세는 것처럼 횟수 반복으로 하기 어려운 모양도 동안 반복하자로 할 수 있어요.

'수'를 0으로 정하자
('수'가 10 이하이다)인 동안 반복하자:
    '수'를 이어출력하자
    " "를 이어출력하자
    '수'에 2를 더하자

0 2 4 6 8 10이 한 줄에 나와요.


중간에 끝내기: 반복을 끝내자

반복을 끝내자를 만나면 가장 안쪽 반복문에서 바로 빠져나와요. 찾던 것을 찾았을 때 더 돌 필요가 없으니까요.

'수들'을 [3, 8, 12, 5, 20]으로 정하자

'수들'의 '수'마다 반복하자:
    만약 ('수'가 10보다 크다) 라면:
        틀"10보다 큰 첫 수: {'수'}"를 출력하자
        반복을 끝내자

12를 찾자마자 끝나서 20은 보지 않아요.

어떤 값만 건너뛰고 싶다면 할 일을 만약으로 감싸면 돼요.

1부터 6까지 반복하자 ('수'):
    만약 ('수' % 2가 0과 같다) 라면:
        '수'를 출력하자

짝수 2, 4, 6만 나와요.


반복 안에서 만든 이름표

반복은 돌 때마다 새 공간을 열어요. 반복 안에서 처음 만든 이름표는 그 바퀴가 끝나면 사라져서, 반복 밖에서는 쓸 수 없어요.

1부터 2까지 반복하자 ('횟수'):
    '제곱'을 '횟수' * '횟수'로 정하자
'제곱'을 출력하자

“‘제곱’ 변수를 찾을 수 없어요.” 가 나와요. 반복이 끝난 뒤에도 쓸 값은 반복 앞에서 만들어 두고, 안에서는 그 값을 바꾸세요(위의 “모두 더하기” 모양).


함께 써 보기

단어 세기: 목록의 단어가 몇 번씩 나왔는지 사전에 세어요.

'단어들'을 ["사과", "배", "사과", "귤", "사과"]로 정하자
'세기'를 {}로 정하자

'단어들'의 '단어'마다 반복하자:
    만약 ('세기'의 <포함확인>('단어')) 라면:
        '세기'의 '단어'에 1을 더하자
    그렇지 않다면:
        '세기'의 '단어'를 1로 정하자

'세기'를 출력하자

사전 목록 돌기: 같은 모양의 사전 여러 개를 목록에 담아 하나씩 다뤄요.

'반'을 [{"이름": "하나", "점수": 90}, {"이름": "두리", "점수": 85}, {"이름": "세리", "점수": 72}]로 정하자
'합'을 0으로 정하자

'반'의 '학생'마다 반복하자:
    틀"{'학생'의 "이름"}: {'학생'의 "점수"}점"을 출력하자
    '합'에 '학생'의 "점수"를 더하자

틀"평균: {'합' / '반'의 '길이'}점"을 출력하자

알아 두면 좋은 것

  • 반복이 시작될 때 돌 횟수가 정해져요. 1부터 '끝'까지에서 반복 안에서 '끝'을 바꿔도 돌 횟수는 그대로예요.
  • 마다 반복하자는 시작할 때의 목록을 돌아요. 반복 안에서 그 목록에 값을 추가해도 새 값은 돌지 않아서, 끝나지 않는 반복이 생기지 않아요.
'수들'을 [1, 2, 3]으로 정하자

'수들'의 '수'마다 반복하자:
    '수들'에 '수'를 추가하자

틀"개수: {'수들'의 '길이'}"를 출력하자

개수: 6이 나와요. 세 번만 돌고, 그동안 3개가 추가됐어요.


자주 하는 실수

1. 끝나지 않는 동안 반복

조건에 쓰인 값을 반복 안에서 바꾸지 않으면 영원히 돌아요. 실행 버튼이 계속 “실행 중”이면 이걸 의심하고 페이지를 새로 고치세요.

2. 반복 안에서 합계 이름표를 만들기

'합'을 0으로 정하자를 반복 안에 쓰면 매 바퀴 0으로 돌아가고, 반복이 끝나면 사라져요. 반복 앞에 쓰세요.

3. 들여쓰기

반복할 줄은 모두 한 단계 들여 써야 해요. 들여 쓰지 않은 줄은 반복이 다 끝난 뒤 한 번만 실행돼요.


정리

하고 싶은 일 쓰는 법
N번 반복 1부터 N까지 반복하자 ('횟수'):
거꾸로 N부터 1까지 반복하자 ('횟수'):
목록의 값마다 '목록'의 '값'마다 반복하자:
사전의 키마다 '사전'의 '키'마다 반복하자:
글자마다 '문자열'의 '글자'마다 반복하자:
조건이 참인 동안 (조건)인 동안 반복하자:
중간에 끝내기 반복을 끝내자
합계 반복 앞에서 '합'을 0으로 정하자, 안에서 '합'에 …를 더하자

연습 문제

1. 구구단 3단을 출력해 보세요. (3 x 1 = 3 … 3 x 9 = 27)

정답 예시
1부터 9까지 반복하자 ('i'):
    틀"3 x {'i'} = {3 * 'i'}"를 출력하자

2. 목록에서 가장 큰 수를 찾아 출력해 보세요.

'수들'을 [7, 3, 19, 4, 11]로 정하자
정답 예시
'수들'을 [7, 3, 19, 4, 11]로 정하자
'최대'를 '수들'의 1번째로 정하자

'수들'의 '수'마다 반복하자:
    만약 ('수'가 '최대'보다 크다) 라면:
        '최대'를 '수'로 정하자

틀"가장 큰 수: {'최대'}"를 출력하자

처음 값을 ’지금까지의 최대’로 두고, 더 큰 수를 만날 때마다 바꿔요.

3. 1부터 100까지의 수 중에서 3의 배수만 모두 더해 보세요.

정답 예시
'합'을 0으로 정하자
1부터 100까지 반복하자 ('수'):
    만약 ('수' % 3이 0과 같다) 라면:
        '합'에 '수'를 더하자
'합'을 출력하자

1683이 나와요.

4. 2중 반복으로 구구단 2단부터 4단까지 출력해 보세요. (힌트: 반복 안에 반복을 넣고 들여쓰기를 한 단계 더 해요.)

정답 예시
2부터 4까지 반복하자 ('단'):
    틀"[{'단'}단]"을 출력하자
    1부터 9까지 반복하자 ('i'):
        틀"{'단'} x {'i'} = {'단' * 'i'}"를 출력하자

다음 장에서는 자주 쓰는 코드를 묶어서 이름을 붙이는 함수를 배워요.

놀이터
결과
코드를 작성하고 '실행' 버튼을 눌러보세요.