빅데이터 분석을 하거나 코딩을 하다 보면 엑셀의 매크로처럼 특정 연산이나 명령어를 수십, 수백 번 반복해서 찍어내야 할 때가 참 많습니다. 다른 프로그래밍 언어들(C, Java, Python 등)에서는 이 “반복문(Loop)”을 가장 먼저, 그리고 핵심 엔진으로 배우곤 합니다.
사실 앞서 배웠듯 R은 모든 연산이 벡터 기반(Vectorized)으로 통째로 이루어지기 때문에 태생적으로 반복 작업을 내부 C언어 단에서 자연스럽게 처리하여 굳이 느린 하드코딩 반복문을 쓰지 않아도 되는 경우가 대다수입니다. 그럼에도 불구하고 시뮬레이션을 구현하거나 웹 크롤링 시 순차적 로드가 필요할 때 반드시 꺼내들어야 하는 고전적인 두 가지 무기, for문과 while문을 기초부터 꽉 잡아봅시다.
1. 정해진 범위만큼 순회하는 for 반복문
for 구문은 우리가 넘겨준 범위(리스트, 벡터 요소 등)의 안에 들어 있는 원소들을 맨 앞에서부터 하나씩 뽑아내면서 대괄호 {} 안의 코드를 반복 실행합니다. 횟수가 명확히 정해져 있을 때 압도적으로 유리합니다.
# 기본 작동 뼈대
for (임시변수 in 지정범위) {
# 반복해서 실행할 진짜 코드
}
가장 기초적인 작동 예제를 볼까요? 숫자 1부터 3까지를 순서대로 i에 담아와서, 문자와 결합해 출력(인쇄)하는 작업을 실행해 봅니다.
for (i in 1:3) {
print(paste("순서가 돌아왔습니다:", i))
}
> [1] "순서가 돌아왔습니다: 1"
> [1] "순서가 돌아왔습니다: 2"
> [1] "순서가 돌아왔습니다: 3"
위 코드에서 임시 변수 i에 처음 루프에는 1이 들어가서 코드가 전개되고, 두 번째 바퀴에는 2, 마지막 바퀴에는 3이 들어가면서 총 3번의 루프가 깨끗하게 돌아간 것을 볼 수 있습니다. 흐름이 매우 직관적이기 때문에 코드 가독성을 극대화합니다.
2. 조건이 참인 동안 끝없이 도는 while 반복문
for 구문이 ‘도착지와 횟수가 정해져 있는 100m 달리기’ 였다면, while 구문은 ‘내 심장(조건)이 멈추기 전까지 지치지 않고 영원히 뛰는 런닝머신’과 같습니다.
while (조건식) {
# 조건식이 진짜(TRUE)인 동안 무한 반복 실행
}
다음 시뮬레이션 예제를 따라가봅시다. 초기 임시 숫자를 0으로 세팅하고, 값이 10 이하일 때만 계속 숫자에 3을 복리로 더하면서 출력되도록 만든 로직입니다.
i <- 0
while (i <= 10) {
i <- i + 3
print(i)
}
> [1] 3
> [1] 6
> [1] 9
> [1] 12
처음엔 i가 0이니 조건(10보다 작음)이 만족되죠? 루프가 시작됩니다. i가 3, 6, 9가 될 때까지도요. 그런데 9에 3을 더해서 12가 출력되고 나면, 심판이 다음 바퀴 조건을 검사할 때 i <= 10 이라는 조건이 거짓(FALSE) 판정을 받으면서 루프 스위치를 끄고 멈추게 됩니다.
3. 무한 루프 긴급 탈출 버튼: break
while문을 쓸 때 타이핑 실수로 조건식을 잘못 설정해서 무조건 TRUE만 나와버리는 블랙홀에 빠지면 어떻게 될까요? 프로그램이 정상 종료되지 않고 영원~히 메모리를 갉아먹으며 프로세서가 터질 때까지 무한 반복을 돌아버립니다.
이를 사전에 강력하게 방지하기 위해서, 혹은 크롤링 도중 “어? 목표 데이터베이스를 모두 긁어모았네? 더이상 돌지 말고 당장 멈춰!” 라고 스크립트 내부에서 강제 탈출 명령을 하달해야 할 때 break 키워드를 비상구로 씁니다.
i <- 0
while (TRUE) { # 조건식이 논리형 참! (원래라면 무한 루프)
i <- i + 3
if (i > 10) {
break # i가 10을 넘기면 강제로 반복문을 박살내고 나옵니다!
}
print(i)
}
> [1] 3
> [1] 6
> [1] 9
마지막 바퀴에 i가 10을 넘겨 12가 된 순간 시스템이 break 구문을 발동시켜 밑의 출력(print) 파트까지 가지도 못하고 바로 루프 바깥으로 탈출해버린 깔끔한 제어 모습입니다.
이 고전적이면서도 강력한 두 개의 제어 무기(for, while)는 비단 R뿐만 아니라 모든 프로그래밍 언어의 기초 체력을 키워주며 복잡한 로직을 해결하는 알고리즘의 치트키가 되어줍니다. 꼭 직접 Positron이나 RStudio 창에 타이핑 해보시면서 루프의 작동 메커니즘을 내 것으로 만들어보시기 바랍니다!
당신이 좋아할 만한 콘텐츠
by Google Adsense