문서 읽는 데 44분 · A4

A-4: 흐름을 제어하는 사고

목차 29
전체 7강 중 4강 · 개발 입문
난이도 · 입문

ℹ️코딩이 처음인 비전공자를 위한 첫 과목 — 컴퓨터의 원리와 “프로그래밍적 사고”를 먼저 잡아요. 선수 지식 없이 시작할 수 있어요.

안녕하세요, 홍순구 튜터입니다. 벌써 네 번째 시간이네요. 지난 시간(A-3)에 우리는 값을 담는 변수와 그 값을 다루는 세 연산을 배웠어요. 그리고 마지막에 비교와 논리로 참/거짓을 만들어 상자에 담아만 뒀죠. 제가 그때 약속을 하나 했어요 — "오늘 만든 참/거짓이 다음 시간 갈림길의 신호등이 된다"고요.

오늘 그 신호등을 켭니다. 지금까지 우리가 적은 의사코드는 전부 위에서 아래로 한 줄씩 곧장 내려가기만 했어요. 그런데 진짜 프로그램은 그렇게만 흐르지 않아요. "이 경우엔 이 길로, 저 경우엔 저 길로" 갈라지기도 하고, 같은 일을 여러 번 되풀이하기도 합니다. 오늘은 바로 그 흐름을 다루는 법을 배워요.

좋은 소식부터 말씀드릴게요. 오늘 배울 건 딱 세 가지 흐름이 전부예요 — 순차·선택·반복. 세상 모든 프로그램이, 아무리 복잡해 보여도, 이 셋의 조합으로만 이뤄져 있어요. 그래서 오늘 이 셋을 손에 넣으면, 여러분은 프로그램이 어떻게 움직이는지의 큰 절반을 알게 됩니다. 그리고 이 흐름을 한눈에 보이게 그리는 도구, 순서도도 오늘 처음 직접 그려 볼 거예요.

텍스트
   오늘의 여정 — 흐름을 제어하는 사고

   ① 프로그램이 흐르는 세 가지 길 — 순차·선택·반복
   ② 흐름을 그림으로 — 순서도 기호와 그리기
   ③ 갈림길 하나 — 만약 ~이면
   ④ 여러 갈래 — 아니면, 그리고 또 아니면
   ⑤ 정해진 횟수만큼 되풀이 — N번 반복
   ⑥ 조건이 참인 동안 되풀이 — ~하는 동안
   ⑦ 끝나지 않는 반복 — 무한 루프 함정
   ⑧ 조건과 반복을 함께 — 출석부 종합 의사코드

①에서 세 가지 흐름의 큰 그림을 잡고, ②에서 그 흐름을 그리는 순서도를 배웁니다. ③④에서 조건(선택)을, ⑤⑥⑦에서 반복을 익히고, ⑧에서 조건과 반복을 함께 엮어 작은 프로그램 한 편을 완성해 봅니다.

💡 오늘 수업의 핵심 — "프로그램의 흐름은 순차·선택·반복 세 가지로 이뤄지고, 선택은 '만약 ~이면'으로 길을 가르고 반복은 'N번' 또는 '~하는 동안'으로 같은 일을 되풀이한다 — 이 흐름을 순서도로 그리고 의사코드로 적되, 반복에는 끝내 줄 종료 조건이 반드시 있어야 한다"

🎯 학습 목표

  • 프로그램의 세 흐름(순차·선택·반복)을 구분하고, 일상의 한 장면에서 선택과 반복이 어디 있는지 찾아냅니다.
  • 조건(만약 ~이면 / 아니면)과 반복(N번 / ~하는 동안)을 의사코드와 순서도로 직접 그립니다.
  • 반복이 끝나려면 종료 조건이 필요함을 이해하고, 무한 루프에 빠지는 경우와 그것을 막는 법을 설명합니다.

Step 1: "프로그램이 흐르는 세 가지 길 — 순차·선택·반복"

지금까지 우리가 적은 의사코드를 떠올려 보세요. 전부 맨 윗줄부터 시작해 한 줄씩 차례대로 아래로 내려갔어요. 사과값 ← 1500 다음에 우유값 ← 2800, 그다음 합계 ← … 이런 식으로요. 이렇게 위에서 아래로 순서대로 흐르는 걸 순차(차례대로)라고 불러요. 가장 기본이 되는 흐름이죠.

그런데 현실의 일은 늘 한 줄로만 흐르지 않아요. 두 가지가 더 필요합니다.

텍스트
   프로그램이 흐르는 세 가지 길

   순차   ─  위에서 아래로 차례대로
   선택   ─  조건에 따라 길이 갈라진다
   반복   ─  같은 일을 되풀이한다

선택은 길이 갈라지는 거예요. "신호가 빨강이면 멈추고, 아니면 지나간다"처럼 상황에 따라 다른 길로 가는 거죠. 지난 시간에 만든 참/거짓이 바로 여기서 쓰여요. 참이면 이 길, 거짓이면 저 길. 그래서 그 참/거짓을 "갈림길의 신호등"이라고 불렀던 거예요.

반복은 같은 일을 여러 번 되풀이하는 거예요. 출석을 부를 때 명단 끝까지 한 명씩 이름을 부르는 것, 줄넘기를 100번 하는 것처럼요. 똑같은 동작을 사람이 일일이 다시 적지 않고 "이걸 되풀이해라" 한 번으로 끝내는 게 반복입니다.

놀라운 사실 하나를 말씀드릴게요. 여러분이 매일 쓰는 앱, 게임, 웹사이트가 아무리 복잡해 보여도, 그 안의 흐름은 전부 이 세 가지(순차·선택·반복)의 조합일 뿐이에요. 더도 덜도 없어요. 그래서 오늘 이 셋만 또렷이 잡으면, 어떤 프로그램을 보든 "여기는 갈라지는 곳, 저기는 되풀이되는 곳"이 눈에 들어오기 시작합니다.

💡 한 줄 정리

모든 프로그램의 흐름은 순차(차례대로)·선택(조건에 따라 갈라짐)·반복(되풀이) 세 가지의 조합으로 이뤄지며, 지난 시간 만든 참/거짓이 선택의 갈림길에서 신호등 역할을 한다.

🙋 학생 질문 — "튜터님, 흐름이 정말 이 세 가지뿐인가요? 너무 적은 것 같아요."

처음 들으면 "이렇게 간단할 리가" 싶죠. 그런데 정말 이 셋뿐이에요. 이건 그냥 제 말이 아니라, 오래전 컴퓨터 과학자들이 증명한 사실이기도 해요. 아무리 거대한 프로그램도 순차·선택·반복만 있으면 다 표현할 수 있다는 거죠.

비유하자면 레고 같아요. 블록 종류는 몇 가지 안 되지만, 그걸 어떻게 조합하느냐에 따라 자동차도 되고 성도 됩니다. 흐름도 똑같아요. 세 가지를 어떻게 엮느냐에서 무한한 프로그램이 나오는 거예요. 복잡함은 종류가 많아서가 아니라, 단순한 것을 깊이 쌓아 올려서 생깁니다.

그러니 "겨우 셋"이라고 얕보지 마세요. 오늘 이 셋을 제대로 잡으면, 앞으로 만날 모든 프로그램의 뼈대를 잡은 거예요.


Step 2: "흐름을 그림으로 — 순서도 기호와 그리기"

흐름이 갈라지고 되풀이되기 시작하면, 글로만 적어선 머릿속에 잘 안 그려져요. 그래서 사람들은 흐름을 그림으로 그리는 약속을 만들었어요. 그게 바로 순서도(flowchart)입니다. 말 그대로 "순서를 그린 도(圖, 그림)"예요.

순서도는 몇 가지 정해진 도형으로 흐름을 그려요. 도형마다 뜻이 정해져 있어서, 누가 그려도 같은 모양이면 같은 뜻으로 읽혀요. 입문 단계에서 알아 둘 기호는 네 가지예요.

텍스트
   순서도의 네 가지 기호

   ┌──────┐
   │ 시작 │      둥근 사각/타원 = 시작과 끝
   └──────┘

   ┌──────────┐
   │ 처리하기 │     사각형 = 처리(무언가를 한다)
   └──────────┘

   ◇ ~인가?         마름모 = 판단(참/거짓을 묻는다)

   │               화살표 = 흐름이 가는 방향

하나씩 볼게요. 시작과 끝은 둥근 모양 상자로 그려요. 프로그램이 어디서 시작해 어디서 끝나는지 표시하는 거죠. 처리는 사각형이에요. "물을 끓인다", "합계를 구한다"처럼 무언가 한 가지 일을 하는 토막이죠. 판단은 마름모()예요. "신호가 빨강인가?"처럼 참/거짓을 묻는 갈림길이고요. 마지막으로 화살표는 흐름이 어느 방향으로 가는지 이어 주는 선이에요.

먼저 가장 단순한 순차 흐름부터 그려 볼게요. 라면 끓이는 순서를 순서도로 그리면 이래요. 갈라짐도 되풀이도 없이 위에서 아래로 곧장 흐르죠.

텍스트
   ┌──────────────────┐
   │       시작       │
   └─────────┬────────┘
             │
             
   ┌──────────────────┐
   │   물을 끓인다    │
   └─────────┬────────┘
             │
             
   ┌──────────────────┐
   │   면을 넣는다    │
   └─────────┬────────┘
             │
             
   ┌──────────────────┐
   │   3분 기다린다   │
   └─────────┬────────┘
             │
             
   ┌──────────────────┐
   │        끝        │
   └──────────────────┘

시작에서 출발해, 처리 상자들을 화살표 따라 차례로 지나, 끝에 도착하죠. 이게 순차 흐름의 순서도예요. 아직 마름모(판단)는 안 나왔어요. 그건 다음 Step에서 길이 갈라질 때 등장합니다. 지금은 "흐름을 도형과 화살표로 그린다"는 감각만 잡으면 충분해요.

💡 한 줄 정리

순서도는 흐름을 정해진 도형으로 그리는 약속이다 — 둥근 상자(시작/끝)·사각형(처리)·마름모(판단)·화살표(흐름 방향), 이 네 가지로 순차 흐름을 위에서 아래로 그린다.

🙋 학생 질문 — "튜터님, 어차피 의사코드로 적을 건데 순서도를 왜 또 그려요?"

좋은 질문이에요. 둘은 같은 흐름을 다른 방식으로 보여 주거든요. 의사코드는 흐름을 로 또박또박 적고, 순서도는 흐름을 그림으로 한눈에 보여 줘요. 각자 잘하는 게 달라요.

순서도의 강점은 "길이 어디서 갈라지고 어디서 합쳐지는지"가 눈에 확 들어온다는 거예요. 특히 조건과 반복이 얽혀 복잡해지면, 글로만 보면 헷갈리는 흐름도 그림으로 그리면 단번에 보입니다. 그래서 복잡한 흐름을 설계할 때 먼저 순서도로 그려 보고, 그게 또렷해지면 의사코드로 옮기는 사람이 많아요.

지금 단계에선 "둘 다 연습한다"가 정답이에요. 같은 흐름을 그림으로도 그려 보고 글로도 적어 보면, 흐름을 양쪽 눈으로 보는 셈이라 훨씬 단단히 익혀집니다. 다음 시간(A-5)에서는 이 둘을 오가며 문제를 푸는 연습을 본격적으로 해요.


Step 3: "갈림길 하나 — 만약 ~이면"

이제 길을 갈라 볼 차례예요. 가장 단순한 갈림길부터 시작합니다 — 조건이 참일 때만 무언가 하는 경우요. "만약 비가 오면, 우산을 챙긴다." 비가 안 오면? 그냥 아무것도 안 하고 지나가죠. 이렇게 조건 하나로 길이 갈라지는 게 선택의 첫걸음이에요.

의사코드로는 이렇게 적어요. 지난 시간에 만든 비교(참/거짓)가 여기서 갈림길의 신호등으로 쓰입니다.

텍스트
만약 좋아요_수 가 100 이상이면
    "인기글" 출력

만약 ~이면 다음 줄을 한 칸 들여썼죠? 이 들여쓴 줄이 "조건이 참일 때만 하는 일"이에요. 좋아요_수가 120이면 좋아요_수 ≥ 100이 참이니 "인기글"을 출력하고, 80이면 거짓이라 이 줄을 건너뛰어요. 들여쓰기는 "이 줄들은 조건 안에 속한다"는 표시예요. 눈으로 봐도 어디부터 어디까지가 조건의 영향을 받는지 또렷하죠.

이걸 순서도로 그리면 마름모(판단)가 처음 등장해요. 신호등 앞에서 멈출지 말지 정하는 흐름을 그려 볼게요.

텍스트
   ┌──────────────────┐
   │       시작       │
   └─────────┬────────┘
             │
             
   ┌──────────────────┐
   │   신호를 본다    │
   └─────────┬────────┘
             │
             
   ◇ 신호가 빨강인가?
   ├─ 예    ─  "멈춤" 출력
   └─ 아니오 ─  (아무것도 안 함)
             │
             
   ┌──────────────────┐
   │        끝        │
   └──────────────────┘

마름모에서 길이 둘로 갈라지죠. "예"(참)면 "멈춤"을 출력하고, "아니오"(거짓)면 아무것도 안 하고 지나가요. 두 길은 다시 만나 끝으로 흘러갑니다. 이렇게 마름모는 "참이면 이쪽, 거짓이면 저쪽"으로 흐름을 가르는 갈림길 기호예요.

여기서 잠깐 짚을 게 있어요. 만약 ~이면의 조건에는 지난 시간 배운 비교가 그대로 들어가요. 좋아요_수 ≥ 100, 신호 = "빨강" 같은 것들요. 심지어 논리(그리고·또는)로 묶은 조건도 들어갈 수 있어요. "좋아요가 100 이상 그리고 댓글이 10 이상이면"처럼요. 지난 시간에 참/거짓을 만드는 법을 배운 게, 오늘 갈림길의 신호를 만들기 위해서였던 거예요.

💡 한 줄 정리

만약 ~이면은 조건이 참일 때만 들여쓴 일을 하고 거짓이면 건너뛰며, 순서도에서는 마름모(판단)가 흐름을 "예/아니오" 두 길로 가른다.

🙋 학생 질문 — "튜터님, 들여쓰기를 안 하면 어떻게 되나요? 그냥 보기 좋으라고 하는 건가요?"

지금 우리 의사코드에서는 들여쓰기가 "보기 좋으라고"에 가까워요. 사람이 읽을 때 어디까지가 조건 안인지 알아보기 쉽게 하는 약속이죠. 들여쓰기가 흐트러져도 사람이 뜻을 짐작할 수는 있어요.

그런데 진짜 프로그래밍 언어로 가면 이야기가 달라져요. 어떤 언어는 이 들여쓰기를 문법 자체로 삼아서, 들여쓰기가 틀리면 프로그램이 다르게 동작하거나 아예 안 돌아가기도 해요. 또 어떤 언어는 들여쓰기 대신 괄호 같은 기호로 "여기부터 여기까지가 조건 안"을 표시하고요. 방식은 언어마다 다르지만, "조건에 속하는 범위를 분명히 표시한다"는 원칙은 어디나 똑같아요.

그러니 지금부터 들여쓰기를 또박또박 맞추는 습관을 들여 두면, 나중에 어떤 언어로 가든 큰 도움이 돼요. 그 진짜 문법은 후속 언어 과목에서 각 언어의 규칙으로 배웁니다.


Step 4: "여러 갈래 — 아니면, 그리고 또 아니면"

Step 3에서는 "참이면 한다, 거짓이면 그냥 지나간다"였어요. 그런데 보통은 거짓일 때도 할 일이 있죠. "비가 오면 우산, 아니면 선글라스"처럼요. 양쪽 다 할 일이 있을 때, 아니면을 붙입니다.

텍스트
만약 좋아요_수 가 100 이상이면
    "인기글" 출력
아니면
    "일반글" 출력

이제 길이 확실히 둘로 갈라져요. 참이면 위 들여쓴 줄("인기글"), 거짓이면 아니면 아래 들여쓴 줄("일반글"). 둘 중 반드시 하나는 실행돼요. 좋아요가 120이면 "인기글", 80이면 "일반글"이 출력되죠. Step 3과 달리 "아무것도 안 하고 지나가기"가 없어요.

그런데 갈래가 셋, 넷으로 늘어날 때도 많아요. 점수를 학점으로 바꾸는 걸 생각해 보세요. 90 이상이면 A, 80 이상이면 B, 70 이상이면 C, 그 아래면 D. 갈림길이 여러 개죠. 이럴 땐 아니면 만약을 사슬처럼 이어 붙여요.

텍스트
만약 점수 가 90 이상이면
    "A" 출력
아니면 만약 점수 가 80 이상이면
    "B" 출력
아니면 만약 점수 가 70 이상이면
    "C" 출력
아니면
    "D" 출력

여기서 아주 중요한 약속이 하나 있어요. 위에서부터 차례로 따져서, 처음 참이 되는 곳에서 멈춘다. 점수가 85라고 해볼게요. 첫 줄 90 이상은 거짓이라 넘어가요. 둘째 80 이상은 참이죠. 그래서 "B"를 출력하고, 나머지 줄은 아예 따지지도 않고 끝나요. 85는 70 이상이기도 하지만, 이미 위에서 B로 결판났으니 C는 검사조차 안 하는 거예요.

텍스트
   여러 갈래 — 위에서부터 첫 참에서 멈춘다 (점수 = 85)

   ◇ 90 이상인가?  ── 거짓 ─ 다음 줄로
   ◇ 80 이상인가?  ── 참  ─ "B" 출력하고 끝  ★ 여기서 멈춤
   ◇ 70 이상인가?              (검사 안 함)
   그 외                       (검사 안 함)

그래서 갈래를 적는 순서가 중요해요. 만약 70 이상을 맨 위에 뒀다면, 85도 90도 전부 "C"가 돼 버려요. 70 이상에서 먼저 걸리니까요. 여러 갈래를 적을 땐 "더 좁고 까다로운 조건을 위로" 두는 게 보통이에요. 이 순서 감각은 다음 시간(A-5) 문제 풀이에서 자주 만나게 됩니다.

💡 한 줄 정리

아니면은 거짓일 때 할 일을 정해 길을 둘로 가르고, 아니면 만약을 이으면 여러 갈래가 되며, 이때 위에서부터 차례로 따져 처음 참이 되는 곳에서 멈추므로 갈래의 순서가 결과를 좌우한다.

🙋 학생 질문 — "튜터님, 90 이상이면 80 이상이기도 한데, 왜 A랑 B가 둘 다 안 나와요?"

핵심을 정확히 짚으셨어요. 맞아요, 95점은 90 이상이면서 동시에 80 이상이고 70 이상이기도 해요. 수학적으로는 세 조건이 다 참이죠. 그런데도 학점은 "A" 하나만 나와야 하잖아요.

그걸 가능하게 하는 게 바로 "처음 참에서 멈춘다"는 약속이에요. 95점은 첫 줄 90 이상에서 이미 참이 되니, "A"를 출력하고 그 즉시 갈림길 전체가 끝나요. 아래 80 이상, 70 이상은 참인지 거짓인지 따지지조차 않아요. 그래서 A와 B가 같이 나오는 일이 없는 거예요.

이게 아니면 만약으로 사슬처럼 잇는 이유예요. 각 갈래가 "앞의 조건들이 전부 거짓이었을 때만" 검사되거든요. 만약 이걸 따로따로 떨어진 만약 세 개로 적으면, 세 개가 각각 독립으로 검사돼서 A·B·C가 다 나와 버려요. "하나만 골라야 하는" 상황에선 반드시 아니면 만약으로 이어야 한다는 걸 기억해 두세요.


Step 5: "정해진 횟수만큼 되풀이 — N번 반복"

이제 흐름의 마지막 종류, 반복으로 갑니다. 같은 일을 여러 번 해야 할 때, 그걸 일일이 다시 적는 건 바보 같은 일이죠. "안녕"을 다섯 번 출력하려고 같은 줄을 다섯 번 쓰진 않아요. 대신 "이걸 다섯 번 되풀이해라" 하고 한 번만 적습니다.

가장 단순한 반복은 횟수가 정해진 경우예요. 출석을 부를 때 학생이 다섯 명이면 다섯 번, 박수를 세 번 치면 세 번. 이걸 의사코드로는 이렇게 적어요.

텍스트
번호  1
다음을 5번 반복
    번호 와 "번 학생!" 을 출력
    번호  번호 + 1

다음을 5번 반복 아래 들여쓴 줄들이 다섯 번 되풀이돼요. 조건에서처럼 들여쓰기가 "반복에 속하는 범위"를 표시하죠. 안을 들여다보면, 번호를 출력하고 그 번호를 1 늘리는 일을 다섯 번 해요. 그래서 "1번 학생!", "2번 학생!", … "5번 학생!"이 차례로 출력됩니다.

여기서 번호 ← 번호 + 1이 핵심이에요. 지난 시간에 본 "지금 값에 1 더해서 도로 담기"죠. 이 줄이 매번 번호를 한 칸씩 올려 주기 때문에, 같은 반복 안인데도 출력되는 번호가 1, 2, 3…으로 바뀌어요. 이렇게 반복이 돌 때마다 한 발짝씩 변하는 값을 흔히 "카운터"(세는 값)라고 불러요.

순서도로 그리면 반복은 되돌아가는 화살표로 표현돼요. 흐름이 아래로만 가지 않고, 다시 위로 올라가 같은 곳을 또 지나는 거죠.

텍스트
   번호  1
     │
     
   ┌─ ◇ 5번을 다 돌았는가?
   │     ├─ 예 ─ 끝
   │     └─ 아니오
   │          
   │        번호 와 "번 학생!" 출력
   │        번호  번호 + 1
   └──────── 되돌아가 다시 검사

왼쪽의 ┌ │ └로 이어진 선이 "되돌아가는 길"이에요. 한 번 돌 때마다 마름모로 돌아와 "다 돌았는가?"를 다시 물어요. 아직 아니면 또 한 바퀴, 다 돌았으면 끝으로 빠져나가죠. 반복의 핵심은 바로 이 "되돌아옴"이에요.

💡 한 줄 정리

다음을 N번 반복은 들여쓴 일을 정해진 횟수만큼 되풀이하고, 카운터(번호 ← 번호 + 1)가 매번 한 칸씩 변해 회차마다 다른 값을 다루며, 순서도에서는 되돌아가는 화살표로 그린다.

🙋 학생 질문 — "튜터님, 그냥 같은 줄을 다섯 번 복사해 붙이면 안 되나요? 그게 더 쉬운데요."

다섯 번이면 그렇게 생각할 수 있어요. 그런데 횟수를 바꿔 보세요. 백 번이면요? 만 번이면요? 같은 줄을 만 번 복사해 붙이는 건 상상만 해도 끔찍하죠. 반복은 횟수가 커질수록 진가를 발휘해요. "되풀이해라"는 한 줄이면 다섯 번이든 만 번이든 숫자만 바꾸면 되니까요.

또 하나 중요한 게 있어요. 복사해 붙이면 나중에 고칠 때 지옥을 봐요. 출력 문구 하나를 바꾸려면 복사한 만 줄을 전부 찾아 고쳐야 하잖아요. 반복으로 적으면 한 군데만 고치면 끝이에요. 실수가 끼어들 틈도, 빠뜨릴 줄도 없어요.

그리고 결정적으로, "몇 번 할지 미리 모르는" 경우엔 복사 붙이기가 아예 불가능해요. "정답을 맞힐 때까지" 같은 건 횟수를 알 수 없으니까요. 바로 그런 반복을 다음 Step에서 배웁니다.


Step 6: "조건이 참인 동안 되풀이 — ~하는 동안"

Step 5는 "다섯 번"처럼 횟수가 정해진 반복이었어요. 그런데 횟수를 미리 모르는 경우가 더 많아요. "현금이 남아 있는 동안 계속 뽑는다", "정답을 맞힐 때까지 다시 묻는다" 같은 거요. 몇 번 돌지는 해 봐야 알죠. 이럴 땐 조건이 참인 동안 되풀이하는 반복을 씁니다.

텍스트
잔액  10000
잔액 이 0 보다 큰 동안 반복
    "1000원 출금" 출력
    잔액  잔액 - 1000

~하는 동안 반복은 매번 되풀이하기 전에 조건을 먼저 따져요. 참이면 들여쓴 일을 하고, 거짓이 되면 멈춰요. 위 예에서 잔액이 10000이니 처음엔 참이라 1000원을 출금하고 잔액을 9000으로 줄여요. 다시 조건을 따지면 9000도 0보다 크니 또 출금… 이렇게 잔액이 0이 될 때까지 열 번 돌고, 잔액이 0이 되는 순간 조건이 거짓이 되어 멈춥니다.

N번 반복과 비교해 볼게요. 둘의 차이는 딱 하나, "횟수를 아느냐"예요.

텍스트
   두 반복의 차이

   N번 반복        ─  몇 번 돌지 미리 안다 (출석 5명·박수 3번)
   ~하는 동안 반복  ─  몇 번 돌지 모른다 (잔액 다 쓸 때까지·정답 맞힐 때까지)

사실 N번 반복도 속을 들여다보면 "정해진 횟수를 다 돌 때까지"라는 조건 반복의 한 모습이에요. Step 5 순서도에서 마름모가 "5번을 다 돌았는가?"를 물었던 게 바로 그거죠. 그래서 둘은 형제 같아요. 횟수를 셀 수 있으면 N번으로 깔끔하게, 횟수를 모르면 조건으로 멈추게 — 상황에 맞는 쪽을 고르면 됩니다.

💡 한 줄 정리

~하는 동안 반복은 되풀이 전에 조건을 먼저 따져 참인 동안 계속하고 거짓이 되면 멈추며, 횟수를 미리 아는 N번 반복과 달리 몇 번 돌지 모를 때 쓴다.

🙋 학생 질문 — "튜터님, 처음부터 조건이 거짓이면 어떻게 되나요?"

아주 날카로운 질문이에요. ~하는 동안 반복은 되풀이하기 전에 조건을 먼저 따진다고 했죠? 그래서 처음부터 조건이 거짓이면, 들여쓴 일을 한 번도 안 하고 그냥 지나가요.

예를 들어 잔액을 0으로 두고 "잔액이 0보다 큰 동안 출금"을 돌리면, 첫 검사에서 이미 거짓(0은 0보다 크지 않으니까)이라 출금을 한 번도 안 해요. 통장에 돈이 없으면 한 푼도 못 뽑는 것과 똑같죠. 아주 자연스러운 동작이에요.

이게 오히려 안전장치가 되기도 해요. "할 게 없으면 안 한다"가 기본이니까요. 조건을 먼저 따지는 반복은 이렇게 "조건이 안 맞으면 0번"이 가능하다는 걸 기억해 두세요. 반대로 "무조건 한 번은 하고 나서 조건을 따지는" 반복도 있는데, 그건 후속 언어 과목에서 만나게 됩니다.


Step 7: "끝나지 않는 반복 — 무한 루프 함정"

반복은 강력하지만, 딱 하나 조심할 게 있어요. 끝나지 않고 영원히 도는 경우예요. 이걸 무한 루프(무한 반복)라고 불러요. 입문자가 가장 자주 빠지는 함정이라, 오늘 제대로 짚고 갈게요.

Step 6의 출금 예시를 다시 볼게요. 거기선 잔액 ← 잔액 - 1000이 매번 잔액을 줄였어요. 그래서 잔액이 점점 0에 가까워지다 결국 조건이 거짓이 되어 멈췄죠. 그런데 만약 그 줄을 깜빡 빠뜨리면 어떻게 될까요?

텍스트
   무한 루프 — 멈출 줄이 없다

   잔액  10000
   ┌─ ◇ 잔액 이 0 보다 큰가?
   │     └─ 예 ─ "1000원 출금" 출력
   └──────── 되돌아간다    잔액을 줄이는 줄이 없다!

잔액이 계속 10000이에요. 줄여 주는 줄이 없으니까요. 그러면 "잔액이 0보다 큰가?"가 영원히 참이라, "1000원 출금"을 끝없이 출력하며 멈추지 않아요. 통장에서 돈이 무한정 쏟아져 나오는 셈이죠. 컴퓨터는 시킨 것만 정확히 하니까, "멈춰라"라고 안 하면 정말 안 멈춰요.

무한 루프에 빠지는 이유는 거의 늘 하나예요. 반복을 멈출 조건이 끝내 거짓이 되지 않는 것. 그래서 반복을 적을 땐 항상 스스로 물어야 해요 — "이 반복은 어떻게 끝나지? 멈추게 할 값이 매번 제대로 변하고 있나?"

텍스트
   반복을 적을 때 꼭 확인할 세 가지

   ① 멈추는 조건이 있는가?        (예: 잔액 이 0 보다 큰가)
   ② 그 조건을 거짓으로 만들 변화가 있는가?  (예: 잔액  잔액 - 1000)
   ③ 그 변화가 정말 조건 쪽으로 가는가?      (줄여야 하는데 늘리고 있진 않은가)

이 셋 중 하나만 빠져도 반복은 영원히 돌아요. 멈출 조건을 깜빡했거나, 카운터를 안 바꿨거나, 줄여야 할 값을 거꾸로 늘리고 있거나. 사실 무한 루프를 찾아내는 건 "프로그램이 왜 이상하게 동작하지?"를 추적하는 일, 곧 디버깅의 첫걸음이에요. 다음 시간(A-5)에서는 이렇게 틀린 곳을 손으로 따라가며 찾아내는 법을 본격적으로 배웁니다.

💡 한 줄 정리

무한 루프는 반복을 멈출 조건이 끝내 거짓이 되지 않을 때 생기며, 이를 막으려면 멈추는 조건·그 조건을 거짓으로 만들 변화·변화의 올바른 방향 세 가지를 늘 확인해야 한다.

🙋 학생 질문 — "튜터님, 무한 루프에 빠지면 컴퓨터가 고장 나나요? 무서워요."

전혀 무섭지 않아요. 고장 나지 않아요. 무한 루프는 입문자라면 누구나, 정말 누구나 한 번쯤 겪는 통과의례 같은 거예요. 저도 수없이 빠뜨렸어요. 그러니 빠졌다고 자책하지 마세요.

무한 루프에 빠지면 프로그램이 멈추지 않고 같은 일을 계속하거나, 화면이 멈춘 것처럼 보여요. 이때는 그냥 그 프로그램을 강제로 멈추면 돼요. 실행을 중단하는 버튼을 누르거나 창을 닫으면 끝이에요. 컴퓨터 자체엔 아무 문제도 안 생겨요. 잠깐 한 프로그램이 바쁘게 돌았을 뿐이죠.

오히려 무한 루프를 한번 겪어 보면 "아, 반복엔 끝내 줄 조건이 꼭 있어야 하는구나"가 몸에 확 새겨져요. 그래서 저는 입문자가 무한 루프에 빠지는 걸 나쁘게 보지 않아요. 잘 배우고 있다는 신호거든요. 겁내지 말고, 빠지면 멈추고, 왜 안 끝났는지 위 세 가지를 점검해 보세요.


Step 8: "조건과 반복을 함께 — 출석부 종합 의사코드"

오늘 배운 걸 한데 모아 볼게요. 진짜 프로그램의 힘은 조건과 반복을 함께 쓸 때 나와요. "여러 개를 하나씩 살펴보면서(반복), 어떤 것만 골라낸다(조건)" 같은 일이죠. 아주 자주 등장하는 흐름이에요.

게시물 다섯 개를 차례로 확인하면서, 좋아요가 100 이상인 인기글이 몇 개인지 세는 프로그램을 의사코드로 적어 볼게요. 입력→처리→출력 뼈대로 보면, 게시물들의 좋아요 수를 받아(입력), 인기글 개수를 세고(처리), 그 개수를 보여 주는(출력) 프로그램이에요.

텍스트
   ── 인기글 세기 (의사코드) ──

인기글_개수  0
게시물_번호  1

게시물_번호 가 5 이하인 동안 반복
    좋아요  그 게시물의 좋아요 수 입력받기
    만약 좋아요 가 100 이상이면
        인기글_개수  인기글_개수 + 1
    게시물_번호  게시물_번호 + 1

"인기글 개수: " 와 인기글_개수 를 출력

들여쓰기를 잘 보세요. ~하는 동안 반복 안에 만약 ~이면이 한 단계 더 들여써져 있죠. 반복 안에 조건이 들어 있는 거예요. 반복이 한 바퀴 돌 때마다 좋아요 수를 받아, 그게 100 이상이면 개수를 1 늘리고, 게시물 번호를 다음으로 넘겨요. 이걸 다섯 번 되풀이하죠.

머릿속으로만 따라가면 헷갈리니, 지난 시간에 배운 손으로 따라가기로 값을 쫓아 볼게요. 다섯 게시물의 좋아요가 차례로 120, 80, 150, 95, 200이라고 해볼게요.

회차 게시물_번호 좋아요 100 이상? 인기글_개수
시작 1 0
1 1 120 1
2 2 80 거짓 1
3 3 150 2
4 4 95 거짓 2
5 5 200 3

표를 한 줄씩 따라가 볼게요. 1회차에 좋아요 120은 100 이상이라 인기글_개수가 0에서 1로 올라가요. 2회차 80은 거짓이라 그대로 1. 3회차 150은 참이라 2, 4회차 95는 거짓이라 그대로 2, 5회차 200은 참이라 3이 돼요. 게시물_번호가 6이 되는 순간 "5 이하인 동안" 조건이 거짓이 되어 반복이 멈추고, "인기글 개수: 3"을 출력하고 끝나죠.

방금 우리가 한 게 오늘 배운 모든 걸 엮은 거예요. 순차로 변수를 준비하고, 반복으로 다섯 번 돌면서, 그 안에서 조건으로 인기글을 가려내고, 카운터로 개수를 셌어요. 그리고 그 흐름을 표로 손수 따라가며 결과가 3이 나오는 걸 두 눈으로 확인했고요. 이 "손으로 따라가기"가 다음 시간(A-5)의 주인공이에요. 거기선 이걸로 문제를 풀고, 틀린 곳까지 찾아냅니다.

💡 한 줄 정리

반복 안에 조건을 넣으면 "여러 개를 하나씩 보며 어떤 것만 골라내는" 일을 할 수 있고, 값을 표로 손수 따라가면 반복이 돌 때마다 카운터와 결과가 어떻게 변하는지 정확히 확인할 수 있다.

🙋 학생 질문 — "튜터님, 반복 안에 또 반복을 넣을 수도 있나요?"

네, 얼마든지요. 반복 안에 조건을 넣었듯이, 반복 안에 또 반복을 넣을 수도 있어요. 흔히 "이중 반복"이라고 불러요. 예를 들어 "다섯 명의 학생마다, 각자의 시험 세 과목 점수를 더한다"라면, 바깥 반복(학생 다섯 번) 안에 안쪽 반복(과목 세 번)이 들어가는 모양이죠.

오늘 우리가 배운 세 흐름(순차·선택·반복)은 이렇게 서로 안에 넣을 수 있어요. 조건 안에 반복, 반복 안에 조건, 반복 안에 반복… 레고 블록을 끼워 맞추듯 자유롭게 조합되죠. Step 1에서 "복잡함은 단순한 셋을 쌓아 올려 생긴다"고 한 게 바로 이 이야기예요.

다만 처음부터 깊이 중첩하려 들면 헷갈리기 쉬워요. 지금은 "반복 안에 조건" 하나만 또렷이 익혀 두면 충분해요. 이중 반복 같은 건 후속 언어 과목에서 실제 문법과 함께 차근차근 만나게 됩니다. 오늘은 "흐름은 서로 끼워 넣을 수 있다"는 감각만 가져가세요.


마무리

네 번째 시간, 정말 잘 따라오셨어요. 오늘 우리는 프로그램이 흐르는 세 가지 길을 배우고, 그 흐름을 순서도로 그리고 의사코드로 적었어요. 코드 한 줄 안 쳤는데도, 조건으로 길을 가르고 반복으로 되풀이하는 작은 프로그램 한 편을 손으로 따라가며 완성했습니다. 이제 여러분은 프로그램이 어떻게 움직이는지의 큰 절반을 손에 넣은 거예요.

오늘 배운 핵심 세 가지

  1. 💡 모든 프로그램의 흐름은 순차·선택·반복 세 가지의 조합이다. 순차는 차례대로, 선택은 조건에 따라 갈라짐, 반복은 되풀이. 아무리 복잡한 프로그램도 이 셋을 쌓아 올린 것이다.
  2. 💡 선택은 만약 ~이면으로 길을 가른다. 거짓일 때 할 일이 있으면 아니면, 갈래가 여럿이면 아니면 만약을 잇되, 위에서부터 첫 참에서 멈추므로 순서가 중요하다.
  3. 💡 반복은 같은 일을 되풀이하되 끝내 줄 조건이 반드시 있어야 한다. 횟수를 알면 N번, 모르면 ~하는 동안. 멈출 조건과 그것을 거짓으로 만들 변화가 없으면 무한 루프에 빠진다.

다음 시간 예고

오늘까지 우리는 프로그래밍의 재료(A-3 변수·연산)와 흐름(A-4 조건·반복)을 모두 손에 넣었어요. 다음 시간(A-5)에는 드디어 이 재료와 흐름으로 진짜 문제를 푸는 법을 배웁니다. 큰 문제를 작게 쪼개는 분해, 핵심만 남기는 추상화, 그리고 문제를 푸는 절차인 알고리즘을요. 그리고 오늘 맛본 손으로 따라가기를 본격적으로 익혀서, 프로그램이 틀렸을 때 어디서 틀렸는지 찾아내는 데까지 씁니다. 오늘 "이 반복은 어떻게 끝나지?"를 점검했던 그 눈이, 다음 시간 틀린 곳을 찾는 디버깅의 출발점이 돼요.


과제

오늘도 종이와 연필로 하는 연습이에요. 순서도는 직접 손으로 그려 봐야 늘고, 의사코드는 직접 적어 봐야 익숙해져요. 부담 없이, 틀려도 좋으니 직접 그리고 적어 보는 게 핵심입니다.

[기초] 조건 하나를 순서도로 그리기

일상에서 "만약 ~라면 ~한다"인 장면 하나를 골라(예: 알람이 울리면 일어난다·비가 오면 우산을 챙긴다·신호가 초록이면 건넌다), 그걸 순서도로 그려 보세요. 시작(둥근 상자)에서 출발해, 판단(마름모 )에서 "예/아니오"로 길을 가르고, 각 길에서 무엇을 하는지 처리(사각형)로 적은 뒤, 끝으로 모이게 그리면 됩니다. Step 3의 신호등 순서도를 본보기로 삼으세요. 손으로 그린 그림이 삐뚤어도 괜찮아요. 흐름이 맞으면 됩니다.

[응용] 1부터 10까지 세는 반복을 의사코드로 적고 손으로 따라가기

1부터 10까지 숫자를 차례로 출력하는 의사코드를 직접 써 보세요. 카운터 변수 하나를 1로 시작해(숫자 ← 1), "10 이하인 동안" 또는 "10번 반복"으로 되풀이하면서, 매번 숫자를 출력하고 1씩 늘리면 됩니다(숫자 ← 숫자 + 1). 다 적었으면 Step 8처럼 값을 표로 손수 따라가, 숫자가 1, 2, 3… 으로 올라가다 언제 반복이 멈추는지 직접 확인해 보세요. 특히 "반복을 멈추는 줄"이 어디인지 표에서 짚어 보는 게 중요해요.

[심화] 1부터 20까지 중 3의 배수만 골라 출력하기

이번엔 반복 안에 조건을 넣어 볼게요. 1부터 20까지 차례로 보면서, 3의 배수일 때만 그 숫자를 출력하는 의사코드를 적어 보세요. 힌트: 어떤 수가 3의 배수인지는 지난 시간에 배운 나머지 연산으로 알 수 있어요. "그 수를 3으로 나눈 나머지가 0이면" 3의 배수죠((숫자 나머지 3) = 0). 반복으로 1부터 20까지 돌면서, 그 안에서 만약 (숫자 나머지 3) 가 0 이면 출력하도록 엮으면 됩니다. 다 적었으면 처음 몇 회차만 표로 따라가, 3·6·9…가 제대로 걸러지는지 확인해 보세요. 순서도로도 그려 보면 더 좋아요(반복 루프 안에 마름모 하나).


생각해볼 주제

정답이 하나로 떨어지지 않는 질문들이에요. 혼자 곰곰이 생각해도 좋고, 같이 공부하는 사람과 이야기 나눠도 좋습니다.

1. 같은 흐름인데 순서도와 의사코드를 둘 다 쓰는 이유는?

오늘 우리는 같은 흐름을 순서도(그림)로도 그리고 의사코드(글)로도 적었어요. 둘은 결국 같은 흐름을 표현하는데, 왜 굳이 두 가지 방식이 다 필요할까요? 순서도가 더 잘 보여 주는 것은 무엇이고, 의사코드가 더 편한 점은 무엇일까요? 길이 복잡하게 갈라지고 되풀이될수록 어느 쪽이 더 도움이 될지, 그리고 둘을 어떤 순서로 쓰면 좋을지 자기 생각을 정리해 보세요.

2. 무한 루프는 왜 위험하고, 어떻게 미리 막을 수 있을까?

Step 7에서 끝나지 않는 반복을 봤어요. 무한 루프가 왜 생기는지(멈출 조건이 끝내 거짓이 되지 않아서), 그리고 그걸 막으려면 반복을 적을 때 무엇을 확인해야 하는지(멈추는 조건·그 조건을 거짓으로 만들 변화·변화의 방향) 자기 말로 정리해 보세요. 한 걸음 더 가서, "왜 컴퓨터는 무한 루프에 빠졌을 때 스스로 '이건 영원히 도는데?'라고 알아채고 멈추지 못할까?"도 생각해 보면 재밌어요. 컴퓨터가 "시킨 것만 한다"는 첫 시간의 이야기와 연결해 보세요.

3. 같은 일을 조건으로도 반복으로도 풀 수 있을 때, 무엇을 기준으로 고를까?

가끔은 같은 결과를 여러 방식으로 만들 수 있어요. 예를 들어 "안녕"을 세 번 출력하는 건, 출력 줄을 세 번 적어도 되고(순차), "3번 반복"으로 적어도 되죠(반복). 둘 다 결과는 같아요. 그렇다면 우리는 무엇을 기준으로 한쪽을 고를까요? 횟수가 적을 때와 많을 때, 나중에 고칠 일이 있을 때와 없을 때를 떠올리며, "어떤 코드가 더 좋은 코드인가"를 자기 나름의 기준으로 생각해 보세요. 정답은 없지만, 이 질문을 던져 보는 것 자체가 좋은 프로그래머로 가는 첫걸음이에요.

✅ 예시 답안정답 보기

이 문서는 A-4 「흐름을 제어하는 사고」의 과제와 생각해볼 주제에 대한 예시답안입니다. 정답을 외우는 용도가 아니라, 개념을 어떻게 내 말과 순서도·의사코드로 풀어내는지 흐름을 참고하는 용도로 보세요. 이 과목은 "정답"보다 "스스로 그리고 적어 보는 것"이 더 중요합니다. 손으로 그린 순서도가 삐뚤어도, 흐름만 맞으면 충분합니다.


과제 예시답안

🎯 [과제 1 예시답안] 조건 하나를 순서도로 그리기

채점 포인트

항목 배점 기준
기호 올바른 사용 35% 시작/끝(둥근 상자)·처리(사각형)·판단(마름모)을 맞게 썼는가
갈림길 표현 40% 판단에서 예/아니오 두 길로 갈라 각 길의 일을 적었는가
흐름의 완결 25% 시작에서 출발해 두 길이 끝으로 모이게 그렸는가

풀이 예시

"알람이 울리면 일어난다"를 골랐습니다.

텍스트
   ┌──────────────────┐
   │       시작       │
   └─────────┬────────┘
             │
             
   ┌──────────────────┐
   │  알람을 듣는다   │
   └─────────┬────────┘
             │
             
   ◇ 알람이 울리는가?
   ├─ 예    ─  "일어난다" 출력
   └─ 아니오 ─  "더 잔다" 출력
             │
             
   ┌──────────────────┐
   │        끝        │
   └──────────────────┘

시작에서 출발해 알람을 듣고, 마름모에서 "알람이 울리는가?"를 따집니다. 울리면(예) 일어나고, 안 울리면(아니오) 더 자죠. 두 길은 다시 만나 끝으로 흘러갑니다.

💡 튜터의 한마디 — 깔끔하게 잘 그렸어요. 이 과제의 핵심은 "마름모에서 길이 둘로 갈라졌다가 다시 하나로 모인다"는 흐름의 모양을 손으로 그려 보는 거예요. 둥근 상자로 시작과 끝을, 사각형으로 처리를, 마름모로 판단을 구분해 쓴 게 좋아요. 한 가지 더 욕심내자면, 거짓일 때 할 일이 딱히 없는 경우(예: 알람이 안 울리면 그냥 지나감)도 그려 보세요. 그땐 "아니오" 길이 아무 처리 없이 곧장 끝으로 가면 됩니다. Step 3에서 본 "거짓이면 아무것도 안 하고 지나가기"가 바로 그 경우예요.

🎯 [과제 2 예시답안] 1부터 10까지 세는 반복을 의사코드로 적고 손으로 따라가기

채점 포인트

항목 배점 기준
카운터와 반복 35% 카운터를 1로 시작해 반복으로 되풀이했는가
멈추는 조건과 증가 35% 10에서 멈추는 조건과 1씩 늘리는 줄을 올바로 적었는가
손으로 따라가기 30% 값 추적 표로 언제 멈추는지 확인했는가

풀이 예시

텍스트
숫자  1

숫자 가 10 이하인 동안 반복
    숫자 를 출력
    숫자  숫자 + 1

카운터 숫자를 1로 시작하고, "10 이하인 동안" 되풀이하면서 매번 숫자를 출력하고 1씩 늘렸습니다. 값을 표로 손수 따라가 볼게요(중간은 줄였습니다).

회차 숫자(출력) 숫자 ← 숫자 + 1 후 10 이하?
1 1 2
2 2 3
10 10 11 거짓 → 멈춤

표 맨 아랫줄을 보세요. 숫자가 10일 때 10을 출력하고 11로 늘어나요. 그다음 "11이 10 이하인가?"를 따지면 거짓이라 반복이 멈춥니다. 그래서 1부터 10까지 정확히 출력되고 끝나죠.

💡 튜터의 한마디 — 잘 풀었어요. 이 과제의 진짜 목적은 "반복이 어디서 멈추는가"를 표로 직접 짚어 보는 거예요. 숫자가 11이 되는 순간 조건이 거짓이 되어 멈춘다는 걸 표에서 확인한 게 제일 중요합니다. 만약 숫자 ← 숫자 + 1 줄을 깜빡했다면 어떻게 됐을까요? 숫자가 영영 1에 머물러 "1이 10 이하인가?"가 늘 참이라, 1만 끝없이 출력하는 무한 루프에 빠졌을 거예요. 그 한 줄이 반복을 끝내 주는 열쇠라는 걸 함께 기억해 두세요.

🎯 [과제 3 예시답안] 1부터 20까지 중 3의 배수만 골라 출력하기

채점 포인트

항목 배점 기준
반복 안에 조건 40% 반복으로 1~20을 돌며 그 안에 조건을 넣었는가
나머지로 배수 판단 35% 3으로 나눈 나머지가 0인지로 3의 배수를 가렸는가
손으로 따라가기 25% 처음 몇 회차를 추적해 걸러짐을 확인했는가

풀이 예시

텍스트
숫자  1

숫자 가 20 이하인 동안 반복
    만약 (숫자 나머지 3) 가 0 이면
        숫자 를 출력
    숫자  숫자 + 1

반복으로 1부터 20까지 돌면서, 그 안에서 "3으로 나눈 나머지가 0인가?"를 따져 0일 때만 출력했습니다. 처음 여섯 회차를 표로 따라가 볼게요.

회차 숫자 숫자 나머지 3 0인가? 출력
1 1 1 거짓
2 2 2 거짓
3 3 0 3
4 4 1 거짓
5 5 2 거짓
6 6 0 6

표를 보면 3과 6에서만 나머지가 0이라 출력되고, 나머지는 건너뛰어요. 이대로 20까지 돌면 3·6·9·12·15·18이 출력됩니다.

💡 튜터의 한마디 — 정확해요. 이 과제의 핵심은 두 가지예요. 첫째, 반복 안에 조건을 넣어 "전부 돌되 어떤 것만 골라내는" 모양을 만든 것. 둘째, 지난 시간에 배운 나머지 연산을 "배수 판단"에 써먹은 거예요. 나머지가 0이면 딱 나눠떨어진다는 그 성질이, 여기서 "3의 배수 가려내기"로 쓰인 거죠. 들여쓰기도 꼭 확인해 보세요 — 만약은 반복 안에 한 단계, 출력은 조건 안에 또 한 단계 들여써져 있죠. 이 들여쓰기 계단이 "무엇이 무엇 안에 들어 있는지"를 한눈에 보여 줍니다. 순서도까지 그려 봤다면, 반복 루프 안에 마름모 하나가 들어앉은 모양이 보였을 거예요.


생각해볼 주제 예시답안

🤔 [생각해볼 주제 1] 같은 흐름인데 순서도와 의사코드를 둘 다 쓰는 이유는

문제 상황 요약

오늘 우리는 같은 흐름을 순서도(그림)로도 그리고 의사코드(글)로도 적었다. 둘은 결국 같은 흐름을 표현하는데, 왜 굳이 두 가지 방식이 다 필요할까? 순서도가 더 잘 보여 주는 것과 의사코드가 더 편한 점을 비교하고, 둘을 어떤 순서로 쓰면 좋을지 정리해 보는 주제다.

튜터의 가이드 및 해설

먼저 둘이 무엇을 하는지 떠올려 보자. 순서도는 흐름을 그림으로 보여 주고, 의사코드는 흐름을 로 적는다. 같은 흐름을 다른 감각으로 표현하는 셈이다. 그런데 잘하는 게 서로 다르다.

순서도의 강점은 "한눈에 보임"이다. 특히 길이 어디서 갈라지고(조건) 어디서 되돌아가는지(반복)가 화살표로 그려지니, 흐름의 전체 모양이 단번에 들어온다. 말로 "이 조건이 참이면 이리 갔다가 다시 위로 올라가서…"라고 설명하면 헷갈리는 것도, 그림으로 보면 "아, 이렇게 도는구나"가 즉시 보인다. 그래서 흐름이 복잡하게 얽힐수록 순서도가 빛난다.

의사코드의 강점은 "정확함과 옮기기 쉬움"이다. 그림은 큰 흐름을 보여 주는 데는 좋지만, "정확히 어떤 값을 어떻게 계산하는지"를 시시콜콜 적기엔 글이 낫다. 인기글_개수 ← 인기글_개수 + 1 같은 세밀한 계산은 글로 적어야 또렷하다. 게다가 의사코드는 나중에 진짜 언어로 거의 그대로 번역되니, 실제 코드에 한 걸음 더 가깝다.

그래서 많은 사람이 둘을 순서대로 쓴다. 먼저 순서도로 큰 흐름을 그려 "길이 이렇게 갈라지고 되풀이되는구나"를 잡고, 그 뼈대가 또렷해지면 의사코드로 옮겨 세부를 채운다. 그림으로 숲을 보고, 글로 나무를 그리는 셈이다. 입문 단계에선 둘 다 연습하는 게 가장 좋다. 같은 흐름을 두 방식으로 표현해 보면, 흐름을 양쪽 눈으로 보게 되어 훨씬 단단히 익는다.

💡 핵심을 한마디로

순서도는 흐름이 갈라지고 되풀이되는 모양을 한눈에 보여 주고, 의사코드는 세밀한 계산을 정확히 적어 진짜 코드에 가깝다. 큰 흐름은 순서도로 먼저 그리고, 세부는 의사코드로 옮기면 좋다.

🤔 [생각해볼 주제 2] 무한 루프는 왜 위험하고, 어떻게 미리 막을 수 있을까

문제 상황 요약

Step 7에서 끝나지 않는 반복(무한 루프)을 봤다. 무한 루프가 왜 생기는지, 그것을 막으려면 반복을 적을 때 무엇을 확인해야 하는지 정리하고, 한 걸음 더 나아가 "왜 컴퓨터는 무한 루프에 스스로 빠져 있음을 알아채고 멈추지 못할까?"를 첫 시간의 "컴퓨터는 시킨 것만 한다"와 연결해 생각해 보는 주제다.

튜터의 가이드 및 해설

무한 루프가 생기는 이유는 거의 늘 하나다. 반복을 멈출 조건이 끝내 거짓이 되지 않는 것. 반복은 매번 "아직 계속할까?"를 조건으로 묻는데, 그 조건이 영영 참이면 영영 돈다. 멈출 조건을 아예 안 적었거나, 적었더라도 그 조건을 거짓으로 만들어 줄 변화가 없을 때 벌어진다.

그래서 막는 법도 분명하다. 반복을 적을 때마다 세 가지를 확인하면 된다. 첫째, 멈추는 조건이 있는가(예: 잔액이 0보다 큰가). 둘째, 그 조건을 거짓으로 만들 변화가 반복 안에 있는가(예: 잔액을 매번 줄이는 줄). 셋째, 그 변화가 정말 조건 쪽으로 가고 있는가(줄여야 하는데 거꾸로 늘리고 있진 않은가). 이 셋 중 하나만 빠져도 반복은 끝나지 않는다. 특히 둘째 — "멈출 값을 한 발짝씩 바꿔 주기"를 깜빡하는 게 가장 흔한 실수다.

이제 더 깊은 질문으로 가 보자. 사람은 옆에서 보면 "어, 이거 계속 도는데?"를 금방 알아챈다. 그런데 컴퓨터는 왜 못 멈출까? 첫 시간에 배운 한 문장이 답이다. 컴퓨터는 시킨 것만 정확히 한다. "조건이 참인 동안 반복하라"고 시켰으면, 조건이 참인 한 그저 충실히 반복할 뿐이다. 그게 영원히 도는 일인지 아닌지를 스스로 판단하지 않는다. 컴퓨터에겐 "이 반복은 영원하다"와 "이 반복은 백만 번 후 끝난다"가 구분되지 않는다. 그저 지금 조건이 참이니 한 바퀴 더 돌 뿐이다.

사실 "이 프로그램이 언젠가 끝나는가"를 컴퓨터가 미리 완벽하게 판단하는 건 원리적으로 불가능하다는 게 오래전에 증명되기도 했다. 그러니 끝내 줄 책임은 사람에게 있다. 컴퓨터의 성실함은 양날의 검이다. 시킨 대로 정확히 하기에 믿음직하지만, 잘못 시키면 그 잘못까지 충실히 영원히 반복한다. 그래서 반복을 적는 사람이 "이건 어떻게 끝나지?"를 늘 스스로 물어야 한다.

💡 핵심을 한마디로

무한 루프는 멈출 조건이 끝내 거짓이 되지 않을 때 생긴다. 컴퓨터는 시킨 것만 정확히 하므로 자기가 영원히 도는지 스스로 알아채 멈추지 못한다 — 끝내 줄 책임은 반복을 적는 사람에게 있다.

🤔 [생각해볼 주제 3] 같은 일을 조건으로도 반복으로도 풀 수 있을 때, 무엇을 기준으로 고를까

문제 상황 요약

같은 결과를 여러 방식으로 만들 수 있을 때가 있다. "안녕"을 세 번 출력하는 건 출력 줄을 세 번 적어도 되고(순차), "3번 반복"으로 적어도 된다(반복). 결과는 같다. 그렇다면 무엇을 기준으로 한쪽을 고를까? "어떤 코드가 더 좋은 코드인가"를 자기 나름의 기준으로 생각해 보는 주제다.

튜터의 가이드 및 해설

먼저 분명히 할 것이 있다. 둘 다 결과가 같다면, "틀리고 맞고"의 문제가 아니다. 둘 다 맞다. 그래서 이건 정답 찾기가 아니라 더 나은 선택 고르기다. 그리고 더 나은 선택을 가르는 기준은 보통 "사람이 읽고 고치기에 어느 쪽이 편한가"다.

횟수가 적을 땐 차이가 작다. "안녕"을 세 번이면, 세 줄로 적든 "3번 반복"으로 적든 큰 차이가 없다. 오히려 세 줄로 곧장 적은 게 더 읽기 쉬울 때도 있다. 그런데 횟수가 커지면 이야기가 완전히 달라진다. 백 번, 만 번을 줄줄이 적는 건 불가능에 가깝다. 이때는 반복이 압도적으로 낫다. 한 줄로 끝나니까.

나중에 고칠 일을 떠올리면 차이는 더 벌어진다. 출력 문구를 "안녕"에서 "반가워"로 바꾼다고 해 보자. 세 줄로 적었으면 세 군데를 다 고쳐야 하고, 하나라도 빠뜨리면 어떤 건 "안녕" 어떤 건 "반가워"가 되어 버린다. 반복으로 적었으면 한 군데만 고치면 끝이다. 빠뜨릴 일도, 어긋날 일도 없다. "같은 일을 한 곳에만 적어 둔다"는 게 고치기 쉬운 코드의 큰 원칙이다.

그리고 결정적으로, "몇 번 할지 미리 모르는" 경우엔 선택의 여지조차 없다. "정답을 맞힐 때까지"는 횟수를 알 수 없으니 줄을 복사해 둘 수가 없다. 반드시 반복이어야 한다. 정리하면, 횟수가 적고 고정이면 어느 쪽이든 좋지만, 횟수가 많거나·바뀔 수 있거나·미리 모를 땐 반복이 답이다. 이렇게 "결과는 같아도 어느 쪽이 더 읽고 고치기 좋은가"를 따져 보는 눈이, 좋은 프로그래머로 가는 첫걸음이다.

💡 핵심을 한마디로

결과가 같다면 틀림이 아니라 "더 나은 선택"의 문제다. 횟수가 적고 고정이면 어느 쪽이든 좋지만, 횟수가 많거나·바뀌거나·미리 모를 땐 한 곳만 고치면 되는 반복이 읽기에도 고치기에도 낫다.

전체 목록 개발 입문