반복문은 주어진 조건에 의해 특정 코드 블록을 반복적으로 실행 할 수 있게 해주는 구문이다. 프로그래밍에서 코드 블록의 반복을 루프(Loop)라고 부르고 반복되는 횟수를 루프 횟수라고 부르는데, 스위프트에서 제공하는 반복문은 루프 횟수가 정해져 있는지를 기준으로 두 가지 방식으로 나눌 수 있다.
- For 반복문
- While 반복문
For 반복문은 in 키워드와 함꼐 사용되어 정해진 횟수만큼 주어진 코드 블록을 반복해서 실행한다. for ~ in {...} 형식으로 사용된다. 정해진 횟수만큼 반복하는 For 반복문과 달리, While 반복문은 주어진 조건이 false가 될 때 까지 계속해서 구문을 반복 실행하는 특성이 있다. 미리 반복 횟수를 정하지 않아도 된다는 장점이 있기 때문에 반복 횟수를 예측하기 어려운 조건의 반복문에서 주로 사용된다.
While 만복문은 While 구문과 repeat ~ while 구문으로 나누어지는데, while 구문은 매번 루프를 시작할 때 조건식을 평가하여 루프를 돌지 말지를 결정하지만 repeat ~ while 구문은 루프를 완료할 때마다 조건을 평가하여 다음 루프 실행 여부를 결정한다.
정리하자면, For 반복문은 횟수에 의한 반복이며 While 반복문은 조건에 의한 반복이라고 할 수 있다.
반복문 내에서 흐름을 제어하고자 할 때에는 break 구문과 continue 구문이 사용된다. 이 구문들은 제어 전달문으로서, 적절한 시점에 사용되어 코드 블록의 실행 흐름을 옮겨주는 역할을 한다.
For ~ in 구문
스위프트에서 일정 횟수만큼 특정 구문을 반복하고자 할 때에는 for ~ in 구문을 사용한다.
for <루프 상수> in <순회 대상> {
<실행할 구문>
}
기본적으로 이 구문을 실행하기 위해서는 세 개의 항목이 필요하다. 루프 상수와 순회 대상, 그리고 실행할 구문이다. for ~ in 구문에서 가장 중요한 것은 순회 대상이다. 순회 대상은 주로 순번을 가지는 집단 자료형이나 똔느 범위를 가지는 데이터 등이 사용되는데, 이 대상의 길이나 포함하고 있는 아이템의 개수만큼 구문이 반복 수행된다. 순회 대상으로 사용할 수 있는 데이터 타입에는 다음과 같은 것들이 있다.
- 배열 (Array)
- 딕셔너리 (Dictionary)
- 집합 (Set)
- 범위 데이터
- 문자열 (String)
for ~ in 구문을 이루는 두 번째 요소인 루프 상수에는 구문이 반복될 때마다 순회 대상이 포함하고 있는 개별 아이템들을 차례로 넘겨받아 임의로 지정하고, 실행 불록 내에서 사용할 수 있도록 해주는 역할을 한다. 이 객체는 루프 구문이 순회할 때마다 자동으로 재선언되므로 let 키워드를 사용하여 직접 선언할 필요가 없다는 점도 유의해야할 부분이다.
for ~ in 구문을 이루는 마지막 요소인 실행 구문은 {} 사이에서 작성된다. 중괄호 {} 로 둘러 싸인 영역을 보통 코드 블록 (Code Block)이라고 부르는데, 다른 구문과 영역을 나누는 용도로 사용된다. 여기서는 for 루프에 의해 반복 실행될 구문의 범위를 표시하는 역할을 한다. 다시 말해, for ~ in 구문의 {} 블록 내에 작성된 구문만 반복해서 실행된다는 뜻이다.

닫힌 범위 연산자로 작성된 범위 데이터 1 ... 5 는 [1, 2, 3, 4, 5]까지의 데이터를 순서대로 생성한다. 이 값이 for ~ in 구문의 순회 대상이 되면 루프 상수인 row 에는 최초에 1이 대입되고, 이어서 실행 블록 내의 구문이 실행된다. 현재 루프 블록 내의 구문은 단순히 루프 상수를 출력하는 print() 함수만 포함되어 있으므로 루프 상수의 값을 콘솔에 출력하고 턴을 마칠 것이다. 이어서 두 번째 반복이 시작되면 이번에는 루프 상수에 범위 데이터의 두 번째 값인 2가 대입되고, 실행 블록 내의 print() 구문이 다시 루프 상수를 출력한다.
for 반복문을 좀더 다양한 형식으로 사용할 수 있다.
for i in 1 ... 9 {
print(" 2 X \(i) = \(i * 2)")
}
// 결과값
// 2 x 1 = 2
// 2 x 2 = 4
// 2 x 3 = 6
// 2 x 4 = 8
// 2 x 5 = 10
// 2 x 6 = 12
// 2 x 7 = 14
// 2 x 8 = 16
// 2 x 9 = 18
루프 상수의 생략
for ~ in 구문을 사용할 때 루프 상수가 필요하지 않을 수도 있다. 순회 대상 자체보다는 단순히 순회 대상의 크기만큼 반복하는 것이 목적인 경우이다. 이때는 언더바(_)를 사용하여 루프 상수를 생략할 수 있다.
let size = 5
let padChar = "0"
var keyword = "3"
for _ in 1 ... size {
keyword = padChar + keyword
}
print("\(keyword)")
// 결과값
// 000003
For ~ in 구문의 중첩
for ~ in 구문은 필요에 따라 중첩하여 사용할 수 있다. for ~ in 구문 내에 또 다른 for ~ in 구문을 작성하여 사용할 수 있다는 뜻이다. 이러한 형태를 흔히들 다중 루프라고 부르는데, 특히 두 개의 루프 구문이 중첩된 코드를 별도로 이중 루프라고 부른다. 이 용어들이 정식 명칭은 아니다. 현업에서 편의상 사용하는 말이다.
다중 루프를 효과적으로 사용하면 대단한 시너지 효과를 낼 수 있지만, 반대로 코드의 해석을 난해하게 만드는 주범이 되기도 하므로 주의해서 사용해야 한다. 구구단 1단부터 9단까지 작성해볼 것이다.
for i in 2 ... 9 {
for j in 1 ... 9 {
print("\(i) X \(j) = \(i * j)", terminator: "\t")
}
print()
}

바깥쪽 루프와 안쪽 루프로 이루어져 있다. 바깥쪽 루프는 2부터 9까지 차례로 순회하고, 안쪽 루프 역시 1부터 9까지 차례대로 순회한다. 바깥쪽 루프가 순회할 때마다 루프 상수 i 에는 2부터 9까지 차례대로 대입되고, 안쪽 루프가 순회할 때마다 루프 상수 j에도 1에서 9까지의 정수가 차례대로 대입된다.
while 구문
앞에서 배운 for ~ in 구문은 미리 정의된 실행 횟수만큼 반복하지만 while 구문은 단순히 주어진 조건식의 결과가 false 가 될 때까지 실행 구문을 계속 반복 수행한다. 다시 말해 while 구문은 '조건을 만족하는 동안은 계속 실행'되는 것으로 이해하면 된다.
for ~ in 구문과 비슷하게 코드를 반복하는 특성이 있기 때문에 종종 어떤 상황에서 무엇을 사용해야하는지 헷갈리는 사람들이 많다. for ~ in 구문은 while 구문으로 쉽게 변경할 수 있지만, 반대로 while 구문이 필요한 상황을 for ~ in 구문으로 처리하는 것은 쉽지 않기 때문에 while 문을 사용해야 하는 상황만 정확하게 정리해두면 이해하기 좋다. while 구문을 사용해야 하는 경우는 아래와 같다.
- 실행 횟수가 명확하지 않을 때
- 직접 실행해보기 전까지는 실행 횟수를 결코 알 수 없을 때
- 실행 횟수를 기반으로 할 수 없는 조건일 때
while <조건식> {
<실행할 구문>
}
while 키워드 다음에는 조건식이 사용되는데, 조건식은 반드시 참(true)이나 거짓(false)을 결과값으로 반환해야 한다. 그래서 주로 비교연산자가 사용되는 경우가 많다. 이 조건식의 값이 true인 동안은 실행 블록 내의 코드가 반복되서 수행되지만, false를 반환하면 그 즉시 반복문의 실행은 종료되고 코드 블록을 빠져나가 바로 다음에 이어지는 구문을 실행하게 된다.
var n = 2
while n < 1000 {
n *= 2
}
print("n = \(n)")
// 결과값
// n = 1024
while 구문에 조건식 대신 true 값을 직접 넣으면 한없이 반복되는 무한 루프가 만들어진다. 코드 블록을 탈출할 수 있도록 break 문을 넣어주지 않는다면 이 프로그램은 프로세스가 종료되지 않는 한 영원히 실행 블록을 반복하게 될 것이다.
while true {
...
}
repeat ~ while 구문
repeat ~ while 반복문은 다른 언어에서 do ~ while 구문에 해당하는 것으로, 스위프트 2.0 버전부터 새로 추가되었다.
repeat {
<실행할 구문>
}
while <조건식>
조건식을 먼저 평가하여 실행 블록의 수행 여부를 결정하는 while 구문과 달리 repeat ~ while 구문은 코드 블록을 일단 실행한 다음에 조건식을 평가하여 반복 여부를 결정한다. 이에 따라 repeat ~ while 구문은 실행 블록의 수행을 최소 한번은 보장하는 특성을 가지는데, 이것이 while 구문과의 결정적인 차이점이다.
var n = 1024
while n < 1000 {
n *= 2
}
print("n = \(n)")
// 결과값
// n = 1024
while 구문이다. 변수 n의 값을 1024로 입력한 다음에 반복문을 실행하면 주어진 조건식에서는 n < 1000 조건을 만족하지 못하므로 false 가 된다. 따라서 내부의 n *= 2 구문은 한번도 실행되지 않은 상태로 반복문이 종료되어 버리고 n의 값은 아무런 변화 없이 처음에 입력한 값 그대로 유지된다. 하지만 이를 repeat ~ while 구문으로 처리하면 결과는 다르다.
var n = 1024
repeat {
n *= 2
} while n < 1000
print("n = \(n)")
// 결과값
// n = 2048'swift' 카테고리의 다른 글
| 스위프트 제어 전달문 (1) | 2024.04.06 |
|---|---|
| 스위프트 조건문 (0) | 2024.04.06 |
| 스위프트 연산자 (1) | 2024.04.03 |
| 스위프트 자료형 (1) | 2024.04.03 |
| 스위프트 변수와 상수 (2) | 2024.04.03 |