🔥 for-In 루프

695자
8분

Swift에서는 for-in 루프를 사용하여 배열의 요소, 숫자의 범위 또는 문자열의 문자와 같은 시퀀스를 반복할 수 있답니다.

다음 예제는 for-in 루프를 사용하여 배열의 항목을 반복하는 방법을 보여줍니다:

let names = ["Anna", "Alex", "Brian", "Jack"]
for name in names {
    print("Hello, \(name)!")
}
// Hello, Anna!
// Hello, Alex!
// Hello, Brian!
// Hello, Jack!
swift

이 코드는 names 배열의 각 요소를 반복하면서, 루프 내에서 name 상수를 사용하여 현재 요소에 접근할 수 있게 해줍니다. 그리고 print() 함수를 사용하여 각 이름을 출력하고 있죠.

for-in 루프는 딕셔너리의 키-값 쌍에 접근하는 데에도 사용할 수 있습니다. 딕셔너리를 반복할 때 각 항목은 (key, value) 튜플로 반환되며, for-in 루프 본문 내에서 사용할 명시적으로 명명된 상수로 (key, value) 튜플의 멤버를 분해할 수 있습니다. 아래 코드 예제에서 딕셔너리의 키는 animalName이라는 상수로 분해되고, 딕셔너리의 값은 legCount라는 상수로 분해됩니다.

let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
for (animalName, legCount) in numberOfLegs {
    print("\(animalName)s have \(legCount) legs")
}
// cats have 4 legs
// ants have 6 legs
// spiders have 8 legs
swift

Dictionary의 내용은 본질적으로 순서가 없으며, 반복해도 검색되는 순서가 보장되지 않습니다. 특히 Dictionary에 항목을 삽입하는 순서는 반복되는 순서를 정의하지 않습니다. 배열과 딕셔너리에 대한 자세한 내용은 Collection Types을 참조하세요.

숫자 범위에 대해서도 for-in 루프를 사용할 수 있습니다. 다음 예제는 5단 곱셈표의 처음 몇 개 항목을 출력합니다:

for index in 1...5 {
    print("\(index) times 5 is \(index * 5)")
}
// 1 times 5 is 5
// 2 times 5 is 10
// 3 times 5 is 15
// 4 times 5 is 20
// 5 times 5 is 25
swift

반복되는 시퀀스는 닫힌 범위 연산자(...)로 표시된 대로 1부터 5까지의 숫자 범위입니다. index의 값은 범위의 첫 번째 숫자(1)로 설정되고 루프 내부의 문이 실행됩니다. 이 경우 루프에는 현재 index 값에 대한 5단 곱셈표의 항목을 출력하는 하나의 문만 포함되어 있죠. 문이 실행된 후 index의 값은 범위의 두 번째 값(2)을 포함하도록 업데이트되고 print(_:separator:terminator:) 함수가 다시 호출됩니다. 이 프로세스는 범위의 끝에 도달할 때까지 계속됩니다.

위의 예에서 index는 루프의 각 반복 시작 시 값이 자동으로 설정되는 상수입니다. 따라서 index를 사용하기 전에 선언할 필요가 없습니다. let 선언 키워드 없이 루프 선언에 포함시키는 것만으로 암시적으로 선언됩니다.

시퀀스의 각 값이 필요하지 않은 경우 변수 이름 대신 밑줄을 사용하여 값을 무시할 수 있습니다.

let base = 3
let power = 10
var answer = 1
for _ in 1...power {
    answer *= base
}
print("\(base) to the power of \(power) is \(answer)")
// Prints "3 to the power of 10 is 59049"
swift

위의 예는 한 숫자를 다른 숫자의 거듭제곱으로 계산합니다(이 경우 310제곱). 1부터 10까지의 닫힌 범위를 사용하여 시작 값 1(30제곱)에 3을 10번 곱합니다. 이 계산의 경우 루프를 통해 각 카운터 값은 불필요합니다. 코드는 단순히 올바른 횟수만큼 루프를 실행하죠. 루프 변수 대신 사용된 밑줄 문자(_)는 개별 값을 무시하고 루프의 각 반복 중에 현재 값에 대한 접근을 제공하지 않습니다.

어떤 상황에서는 두 끝점을 모두 포함하는 닫힌 범위를 사용하고 싶지 않을 수도 있습니다. 시계 면에 매분 눈금을 그리는 것을 고려해 보세요. 0분부터 시작하여 60개의 눈금을 그리고 싶습니다. 하한은 포함하지만 상한은 포함하지 않는 반개방 범위 연산자(..<)를 사용하세요. 범위에 대한 자세한 내용은 Range Operators를 참조하세요.

let minutes = 60
for tickMark in 0..<minutes {
    // render the tick mark each minute (60 times)
}
swift

일부 사용자는 UI에서 더 적은 눈금을 원할 수 있습니다. 그들은 5분마다 하나의 표시를 선호할 수 있죠. 원하지 않는 표시를 건너뛰려면 stride(from:to:by:) 함수를 사용하세요.

let minuteInterval = 5
for tickMark in stride(from: 0, to: minutes, by: minuteInterval) {
    // render the tick mark every 5 minutes (0, 5, 10, 15 ... 45, 50, 55)
}
swift

stride(from:through:by:)를 사용하면 닫힌 범위도 사용할 수 있습니다:

let hours = 12
let hourInterval = 3
for tickMark in stride(from: 3, through: hours, by: hourInterval) {
    // render the tick mark every 3 hours (3, 6, 9, 12)
}
swift

위의 예제들은 범위, 배열, 딕셔너리 및 문자열을 반복하기 위해 for-in 루프를 사용합니다. 그러나 이 구문은 해당 유형이 Sequence 프로토콜을 준수하는 한 사용자 정의 클래스 및 컬렉션 유형을 포함한 any 컬렉션을 반복하는 데 사용할 수 있습니다.

이렇게 for-in 루프를 사용하면 다양한 종류의 시퀀스를 손쉽게 반복할 수 있답니다. 배열이나 딕셔너리같은 컬렉션부터 숫자 범위, 문자열의 문자까지 폭넓게 활용할 수 있죠. 그리고 stride 함수를 이용하면 원하는 간격으로 시퀀스를 건너뛰면서 반복할 수도 있습니다. for-in 루프는 Swift에서 꼭 알아두면 좋을 강력한 기능 중 하나랍니다!