🔥 범위 연산자

457자
5분

Swift에는 값의 범위를 간결하게 표현할 수 있는 범위 연산자(range operators)가 몇 가지 포함되어 있습니다.

닫힌 범위 연산자(Closed Range Operator)

닫힌 범위 연산자(a...b)는 a부터 b까지의 범위를 정의하며, ab 값을 포함합니다. 이때 a의 값은 b보다 크면 안 됩니다.

닫힌 범위 연산자는 for-in 루프와 같이 범위의 모든 값을 사용하여 반복할 때 유용하답니다:

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

for-in 루프에 대한 자세한 내용은 제어 흐름(Control Flow)을 참조하시면 좋을 것 같아요.

반 열린 범위 연산자(Half-Open Range Operator)

반 열린 범위 연산자(a..<b)는 a부터 b까지의 범위를 정의하지만 b는 포함하지 않습니다. 첫 번째 값은 포함하지만 마지막 값은 포함하지 않기 때문에 반 열린이라고 합니다. 닫힌 범위 연산자와 마찬가지로 a의 값은 b보다 크면 안 됩니다. a의 값이 b와 같으면 결과 범위는 비게 됩니다.

반 열린 범위는 배열과 같은 0부터 시작하는 리스트를 다룰 때 특히 유용한데요, 리스트의 길이까지(포함하지 않음) 세는 데 유용하기 때문입니다:

let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..<count {
    print("Person \(i + 1) is called \(names[i])")
}
// Person 1 is called Anna
// Person 2 is called Alex
// Person 3 is called Brian
// Person 4 is called Jack
swift

배열에는 4개의 항목이 있지만 0..<count는 반 열린 범위이므로 3(배열의 마지막 항목의 인덱스)까지만 셉니다. 배열에 대한 자세한 내용은 배열(Arrays)을 참조하시면 도움이 될 거예요.

단방향 범위(One-Sided Ranges)

닫힌 범위 연산자에는 한 방향으로 가능한 한 계속되는 범위에 대한 대체 형식이 있습니다. 예를 들어, 인덱스 2부터 배열 끝까지 배열의 모든 요소를 포함하는 범위 같은 경우죠. 이러한 경우에는 범위 연산자의 한 쪽에서 값을 생략할 수 있습니다. 이러한 종류의 범위를 단방향 범위라고 하는데, 연산자의 한 쪽에만 값이 있기 때문입니다. 예를 들면:

for name in names[2...] {
    print(name)
}
// Brian
// Jack
 
 
for name in names[...2] {
    print(name)
}
// Anna
// Alex
// Brian
swift

반 열린 범위 연산자에도 최종 값만 사용하여 작성하는 단방향 형식이 있습니다. 양쪽에 값을 포함할 때와 마찬가지로 최종 값은 범위에 포함되지 않습니다. 예를 들면:

for name in names[..<2] {
    print(name)
}
// Anna
// Alex
swift

단방향 범위는 첨자뿐만 아니라 다른 맥락에서도 사용할 수 있습니다. 첫 번째 값을 생략한 단방향 범위는 반복할 수 없는데, 반복이 어디서 시작해야 하는지 명확하지 않기 때문입니다. 그러나 최종 값을 생략한 단방향 범위는 반복할 수 있습니다. 다만 범위가 무한히 계속되므로 루프에 대한 명시적 종료 조건을 추가해야 합니다. 또한 아래 코드와 같이 단방향 범위에 특정 값이 포함되어 있는지 확인할 수도 있습니다.

let range = ...5
range.contains(7)   // false
range.contains(4)   // true
range.contains(-1)  // true
swift

이렇게 Swift의 범위 연산자에 대해 자세히 알아보았는데요, 실제로 코드를 작성할 때 매우 유용하게 사용할 수 있을 것 같네요! 😄