Menu

R의 while 반복문: while, repeat, break 설명

R에서 while 반복문이 동작하는 방식입니다. 조건을 먼저 검사하는 반복, R의 do-while 역할을 하는 repeat와 break, next, 그리고 무한 루프를 피하는 습관을 다룹니다.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

while 반복문

R의 while 반복문은 조건이 TRUE인 동안 본문을 계속 실행합니다. for 반복문이 무언가의 원소마다 한 번씩 도는 반면, while은 조건이 바뀔 때까지 알 수 없는 횟수만큼 돕니다.

모든 while 반복문을 동작하게 하는 세 부분이 있고, 여기 셋 다 보입니다.

  1. 반복문 앞의 준비 - count <- 1이 조건이 검사할 대상을 만들어 줍니다.
  2. 조건 - 흔한 비교 연산자로 만든 count <= 5가 매 회차 전에 검사됩니다.
  3. 본문 안의 갱신 - count <- count + 1이 반복문을 종료 쪽으로 밀어 줍니다.

3번을 지우면 조건은 영원히 TRUE가 되어 반복문이 끝나지 않습니다. 그것이 while의 결정적인 위험이며, 이 페이지의 나머지는 대체로 그것을 관리하는 이야기입니다.

조건은 매 회차 전에 검사됩니다

while은 조건을 먼저 검사한 뒤 본문을 실행합니다. 두 가지 결과가 따라옵니다. 시작 시점에 조건이 이미 FALSE이면 본문은 0번 실행됩니다.

그리고 검사는 본문 중간이 아니라 완전한 회차 사이에 일어납니다. 한 회차가 시작되면 도중에 조건이 FALSE가 되더라도 끝까지 실행됩니다. 본문 도중에 빠져나와야 한다면 그것이 break의 역할입니다(아래 참고).

예제: 임계값 아래로 떨어질 때까지 반씩 줄이기

while의 자연스러운 무대는 "무엇이 될 때까지 계속"입니다. 몇 회차가 걸릴지 미리 알 수 없으니 for는 맞지 않습니다. 1000을 1 아래로 떨어뜨리려면 몇 번 반으로 나눠야 할까요?

열 번 나누어 약 0.977에서 끝납니다. 본문이 줄이는 상태 변수와 늘리는 카운터로 이루어진 이 패턴은 실제 while 반복문의 상당수를 차지합니다. 오차가 충분히 작아질 때까지 도는 수치 방법, 자원이 소진될 때까지 도는 시뮬레이션, 호출이 성공할 때까지 이어지는 재시도가 그렇습니다.

repeat + break: R의 do-while

R에는 do-while 키워드가 없습니다. 본문 뒤에 조건을 검사하는 반복문이 없다는 뜻입니다. 하지만 조건 없이 영원히 도는 repeat와, 어떤 반복문이든 즉시 빠져나오는 break가 있습니다. repeat 본문 끝에 break 검사를 두면 정확히 do-while이 만들어집니다. 본문이 최소 한 번은 실행되는 반복문이죠.

본문은 첫 검사보다 항상 먼저 실행되므로 n은 적어도 한 번은 두 배가 됩니다. 반복문은 100을 처음 넘긴 128에서 끝납니다. "일단 하고 나서 또 할지 결정한다"가 정직한 설명일 때 이 형태를 쓰세요. 유효할 때까지 입력을 읽는 경우나, 조건에 맞는 표본이 나올 때까지 추출하는 경우가 그렇습니다. 도달 가능한 break가 없는 repeat는 구조적으로 무한 루프이므로, break를 먼저 쓰고 본문을 채우세요.

breakwhilefor에서 동일하게 동작합니다. 일반적인 "여기서 끝" 탈출구이며, 본문 중간의 조건을 검사하는 if 문과 자연스럽게 짝을 이룹니다.

while 안의 next

next는 현재 회차의 나머지를 건너뛰고 조건 검사로 되돌아갑니다. for에서와 똑같이 동작하지만, while에 특유한 함정이 하나 있습니다. 갱신 단계가 next 뒤에 온다면, 그것을 건너뛰는 순간 반복 변수가 전혀 나아가지 않아 무한 루프가 됩니다. 갱신을 next 앞에 두세요.

2부터 10까지의 짝수가 출력됩니다. i <- i + 1next 줄 아래로 옮기면 첫 홀수에서 갱신이 영원히 건너뛰어집니다. for 반복문에는 이 위험이 없으므로(반복 변수가 자동으로 나아갑니다), 단순히 수열을 훑는 상황이라면 for를 택할 이유가 하나 더 늘어납니다.

무한 루프 방어하기

모든 무한 루프는 같은 버그입니다. 본문의 어떤 것도 조건이 의존하는 변수를 바꾸지 않거나, 잘못된 방향으로 바꾸는 것이죠. 대화형에서는 Esc나 Ctrl+C로 중단할 수 있지만, 스크립트에서는 프로세스가 그냥 멈춰 버립니다. 두 가지 습관이 이를 막아 줍니다.

첫째, 조건을 쓸 때 곧바로 "본문의 어느 줄이 이것을 FALSE 쪽으로 움직이는가?"를 묻고, 그 줄이 본문의 모든 경로에서 실행되는지 확인하세요(위의 next 함정을 주의하세요).

둘째, 종료를 쉽게 증명할 수 없는 반복문에는 최대 반복 횟수 가드를 추가해, 논리 버그가 세션 정지가 아니라 진단 가능한 결과로 드러나게 하세요. 아래에서는 콜라츠 형태의 반복문을 보호합니다. 짝수는 계속 반으로 나누고 홀수 x3 * x + 1로 바꾸며 1에 도달할 때까지 반복합니다.

10에서 시작하면 반복문은 6단계 만에 1에 도달합니다. 어떤 시작값이 1에 결코 도달하지 못한다 해도 steps < 10000 절이 반복문을 끝내 주고, 출력된 상태가 뭔가 잘못되었음을 알려 줍니다. 눈에 보이는 잘못된 답이 영영 답하지 않는 프로그램보다 낫습니다. 여기서는 단축 평가 &&가 알맞은 연산자입니다. 양쪽 모두 단일 값이고, 가드가 한 문장처럼 읽힙니다.

while과 for: 선택하기

경험 법칙은 무엇을 미리 아는지에 달려 있습니다.

  • 무엇을 순회하는지 안다면(벡터의 원소, 1부터 n까지의 숫자) for 반복문을 쓰세요. 반복 변수가 스스로 관리됩니다.
  • 정지 조건만 안다면(수렴할 때까지, 임계값 아래로 갈 때까지, 유효해질 때까지) while을 쓰세요.
  • 어떤 검사든 의미를 갖기 전에 본문이 최소 한 번 실행되어야 한다면 종료용 break가 있는 repeat를 쓰세요.

단지 벡터를 훑기 위해 while 반복문 안에서 카운터를 손수 관리하고 있다면, 그것은 위장한 for 반복문입니다. 바꾸세요.

핵심 정리

  • while (condition) { ... }는 먼저 검사한 뒤 실행합니다. 시작부터 조건이 거짓이면 회차는 0번입니다.
  • 본문은 조건을 FALSE 쪽으로 움직여야 합니다. 준비 / 조건 / 갱신 삼총사가 규율의 전부입니다.
  • R에는 do-while 키워드가 없습니다. repeat { body; if (done) break }가 관용구이며 최소 한 회차를 보장합니다.
  • break는 어떤 반복문에서든 빠져나옵니다. while 안에서 next를 쓸 때는 건너뛰기 전에 반복 변수를 갱신해야 합니다. 그렇지 않으면 영원히 나아가지 않습니다.
  • 최대 반복 횟수 가드(&& steps < 10000)는 잠재적 정지를 눈에 보이고 디버깅 가능한 오답으로 바꿔 줍니다.

다음 순서는 벡터입니다. 이 페이지의 모든 반복문이 훑고 있던 자료 구조이자, 많은 R 반복문이 아예 사라질 수 있는 이유입니다.

자주 묻는 질문

R에서 while 반복문은 어떻게 동작하나요?

while (condition) { ... }는 조건을 먼저 검사하고, 조건이 TRUE인 동안에만 본문을 실행합니다. 본문 안의 무언가가 결국 조건을 FALSE로 만들어야 하며(보통 카운터를 갱신하거나 값을 줄입니다), 그렇지 않으면 반복문이 끝나지 않습니다. 시작 시점에 조건이 FALSE이면 본문은 0번 실행됩니다.

R에 do-while 반복문이 있나요?

키워드로는 없습니다. 관용구는 repeat { ...body...; if (condition) break }입니다. repeat는 조건 없이 반복하므로 본문이 최소 한 번은 실행되고, 끝의 break가 do-while의 종료 검사 역할을 합니다.

R에서 무한 루프는 어떻게 멈추나요?

대화형 환경에서는 Esc(RStudio)나 Ctrl+C(터미널)를 눌러 중단합니다. 애초에 막으려면, 본문이 매 회차마다 조건에 쓰이는 변수를 갱신하도록 하고 최대 반복 횟수 가드를 추가하세요. while (working && steps < 10000)처럼 하면 논리 버그가 세션 정지가 아니라 잘못된 횟수로 드러납니다.

Coddy programming languages illustration

Coddy로 코딩 배우기

시작하기