4.1.1 for ~ in 구문

스위프트에서 일정 횟수만큼 특정 구문을 반복하고자 할 때에는 for ~ in 구문을 사용합니다.

for <루프 상수> in <순회 대상> {

<실행할 구문>

}

기본적으로 이 구문을 실행하기 위해서는 세 개의 항목이 필요합니다. 루프 상수와 순회 대상, 그리고 실행할 구문이죠. for ~ in 구문에서 가장 중요한 것은 순회 대상입니다. 순회 대상은 주로 순번을 가지는 집단 자료형이나 또는 범위를 가지는 데이터 등이 사용되는데, 이 대상의 길이나 포함하고 있는 아이템의 개수만큼 구문이 반복 수행 됩니다. 순회 대상으로 사용할 수 있는 데이터 타입에는 다음과 같은 것들이 있습니다.

  • 배열 (Array)

  • 딕셔너리 (Dictionary)

  • 집합 (Set)

  • 범위 데이터

  • 문자열(String)

for ~ in 구문을 이루는 두 번째 요소인 루프 상수는 구문이 반복될 때마다 순회 대상이 포함하고 있는 개별 아이템들을 차례로 넘겨받아 임의로 지정하고, 실행 블록 내에서 사용할 수 있도록 해주는 역할을 합니다. 이 객체는 루프 구문이 순회할 때마다 자동으로 재선언되므로 let 키워드를 사용하여 직접 선언할 필요가 없다는 점도 유의해야할 부분입니다.

for ~ in 구문을 이루는 마지막 요소인 실행 구문은 { } 사이에 작성됩니다. 중괄호 { }로 둘러 싸인 영역을 보통 코드 블록(Code Block)이라고 부르는데, 다른 구문과 영역을 나누는 용도로 사용됩니다. 여기서는 for 루프에 의해 반복 실행될 구문의 범위를 표시하는 역할을 합니다. 다시 말해, for ~ in 구문의 { } 블록 내에 작성된 구문만 반복해서 실행된다는 뜻입니다.

For 문 예제 및 결과

단힌 범위 연산자로 작성된 범위 데이터 1 ... 5는 [1, 2, 3, 4, 5]까지의 데이터를 순서대로 생성합니다. 이 값이 for ~ in 구문의 순회 대상이 되면 루프 상수인 row에는 최초에 1이 대입되고, 이어서 실행 블록 내의 구문이 실행됩니다. 현재 루프 블록 내의 구문은 단순히 루프 상수를 출력하는 print() 함수만 포함되어 있으므로 루프 상수의 값을 콘솔에 출력하고 턴을 마칠 겁니다. 이어서 두 번째 반복이 시작되면 이번에는 루프 상수에 범위 데이터의 두 번째 값인 2가 대입되고, 실행 블록 내의 print() 구문이 다시 루프 상수를 출력합니다.

for 반복문을 통해 좀 더 다양한 형식의 구문을 가능합니다.

for row in 1 ... 9 {
    print(" 2 X \(row) = \(row * 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 1..<10 {
    for j in 1..<10 {
        // 1x1 = 1, 1x2 = 2 ...
        print("\(i) * \(j) = \(i * j)")
    }
}
1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
1 * 4 = 4
1 * 5 = 5
1 * 6 = 6
1 * 7 = 7

.
.
.

9 * 3 = 27
9 * 4 = 36
9 * 5 = 45
9 * 6 = 54
9 * 7 = 63
9 * 8 = 72
9 * 9 = 81

바깥쪽 루프와 안쪽 루프로 이루어져 있습니다. 바깥쪽 루프는 1부터 9까지 차례로 순회하고, 안쪽 루프 역시 1부터 9까지 차례로 순회합니다. 바깥쪽 루프가 순회할 때마다 루프 상수 i에는 1부터 9까지가 차례로 대입되고, 안쪽 루프가 순회할 때마다 루프 상수 j에도 1부터 9까지의 정수가 차례로 대입됩니다.

Last updated