안녕하세요! 피피아노입니다 🎵
이번 포스팅에서는 제가 코테를 공부하면서 배운 함수인 stride와 enumerated 함수에 대해서 정리를 해보려고 합니다.
그럼 바로 시작하겠습니다!
stride란?
stride 함수는 일정한 간격을 두고 숫자 시퀀스를 생성하는 전역함수로, 반복 작업에서 유연성을 제공하고 숫자의 증가 또는 감소를 간단히 설정할 수 있습니다.
https://developer.apple.com/documentation/swift/stride(from:to:by:)
개발자 페이지를 살펴보면
Returns a sequence from a starting value to, but not including, an end value, stepping by the specified amount.
라고 나와 있는데
이 내용을 해석해보면
지정된 양만큼 이동하면서 시작 값부터 끝 값까지의 시퀀스를 반환합니다. 끝 값은 포함하지 않습니다.
라고 해석할 수 있습니다.
stride 사용법
stride에는 두 가지 주요 형태가 있습니다.
- stride(from:to:by:) - 종료 값 미포함
- stride(from:through:by:) - 종료 값 포함
from은 시작 값을 나타내고 to 또는 through는 끝나는 값을 설정해줍니다. 단 여기에서 to는 끝 값을 포함하지 않고 through는 끝 값을 포함하게 됩니다. 그리고 마지막으로 by는 증가 또는 감소 간격을 설정합니다.
이 내용을 간단하게 정리하면 아래처럼 요약할 수 있습니다.
- from: 시작 값
- to 또는 through: 끝나는 값을 설정 (to는 끝 값을 포함하지 않고, through는 끝 값을 포함)
- by: 증가 또는 감소 간격을 설정
코드 예시
코드로 사용 예시에 대해서 살펴보겠습니다.
먼저 to를 사용한 경우를 살펴보면 아래처럼 코드를 작성할 수 있습니다.
for value in stride(from: 0, to: 10, by: 2) {
print(value)
}
// 출력: 0, 2, 4, 6, 8
그리고 through를 사용한 경우는 아래처럼 코드를 작성해주면 됩니다.
for value in stride(from: 0, through: 10, by: 2) {
print(value)
}
// 출력: 0, 2, 4, 6, 8, 10
위 예시들은 2씩 증가하는 예시였는데 만약 2씩 감소하게 만들고 싶다면 by:에 들어가는 숫자만 -를 붙여서 작성하면 됩니다!
for value in stride(from: 10, to: 0, by: -2) {
print(value)
}
// 출력: 10, 8, 6, 4, 2
stride의 장점
- 간결하고 직관적인 구문으로 일정한 간격의 숫자를 생성
- 증가뿐만 아니라 감소도 쉽게 처리 가능
- for 루프와 함께 사용하여 반복 작업을 단순화
자 이제 stride에 대해서 알아봤으니 enumerated로 넘어가보겠습니다!
enumerated란?
enumerated는 시퀀스(예: 배열, 문자열, 집합 등)의 요소와 각 요소의 인덱스를 함께 사용할 수 있도록 도와주는 Sequence 프로토콜의 확장 메서드입니다.
enumerated도 개발자 페이지 내용을 살펴보겠습니다.
https://developer.apple.com/documentation/swift/array/enumerated()
Returns a sequence of pairs (n, x), where n represents a consecutive integer starting at zero and x represents an element of the sequence.
이렇게 나와 있는데 해석하면
쌍 ( n , x ) 의 시퀀스를 반환합니다 . 여기서 n 은 0에서 시작하는 연속된 정수를 나타내고 x 는 시퀀스의 요소를 나타냅니다.
어렵지 않죠?
enumerated의 동작원리
enumerated의 동작원리를 살펴보면, enumerated 메서드는 호출된 시퀀스의 요소를 (index, element) 형태의 튜플로 변환한 새로운 시퀀스를 반환합니다. 반환된 시퀀스는 lazy sequence로 작동하여, 실제로 반복문이 실행될 때마다 하나씩 처리됩니다.
반환 타입
반환 타입은 개발자 페이지에 나와있는 것처럼
EnumeratedSequence<Self>
입니다.
사용 방법
enumerated는 사용할 수 있는 케이스가 많아서 각 케이스 별로 나눠서 정리해보겠습니다.
배열에서 사용
enumerated()는 배열과 함께 가장 많이 사용됩니다.
let fruits = ["apple", "banana", "cherry"]
for (index, fruit) in fruits.enumerated() {
print("Index: \(index), Fruit: \(fruit)")
}
// 출력:
// Index: 0, Fruit: apple
// Index: 1, Fruit: banana
// Index: 2, Fruit: cherry
문자열에서 사용
String은 Character 타입의 시퀀스이므로 enumerated()를 통해 각 문자의 인덱스와 값을 확인할 수 있습니다.
let text = "Swift"
for (index, char) in text.enumerated() {
print("Index: \(index), Character: \(char)")
}
// 출력:
// Index: 0, Character: S
// Index: 1, Character: w
// Index: 2, Character: i
// Index: 3, Character: f
// Index: 4, Character: t
딕셔너리에서 사용
enumerated()는 딕셔너리에서도 사용할 수 있습니다. 딕셔너리는 (key, value) 쌍의 시퀀스로 작동합니다.
let dictionary = ["a": 1, "b": 2, "c": 3]
for (index, pair) in dictionary.enumerated() {
print("Index: \(index), Key: \(pair.key), Value: \(pair.value)")
}
// 출력 (순서는 내부 구현에 따라 다를 수 있음):
// Index: 0, Key: a, Value: 1
// Index: 1, Key: b, Value: 2
// Index: 2, Key: c, Value: 3
집합(Set)에서 사용
저는 아직 Set을 사용해 본적이 없지만 Set에서도 사용할 수 있다고 나와 있기 때문에 일단 정리를 해두겠습니다.
Set도 시퀀스이기 때문에 enumerated()를 사용할 수 있다고 합니다. 하지만 Set은 순서가 없는 데이터 구조이므로 출력 순서는 예측할 수 없다고 합니다.
주의사항
- Lazy Sequence: enumerated()는 실제로 요소를 필요로 할 때만 동작하는 “지연 평가” 방식입니다. 따라서 원본 데이터가 매우 크거나 동적으로 생성되는 경우 메모리 사용을 최적화할 수 있습니다.
- 순서 보장: 배열(Array)과 문자열(String)처럼 순서가 있는 데이터에서는 항상 동일한 순서를 따르지만, 집합(Set)이나 딕셔너리(Dictionary)는 순서를 보장하지 않습니다.
감사합니다.
잘못된 내용이 있거나 더 좋은 내용 피드백은 언제나 환영합니다!
궁금하신 부분은 댓글로 질문 부탁드립니다!
'Apple > Swift' 카테고리의 다른 글
[Swift] 두 정수 사이의 합 (4) | 2024.12.05 |
---|---|
[Swift] 삼총사 문제 풀이 및 회고 (6) | 2024.11.30 |
[Swift] 과일 장수 문제 풀이 및 회고 (4) | 2024.11.20 |
[Swift] 제곱근 판별하기 (5) | 2024.11.16 |
[Swift] n의 배수 고르기 문제 회고 (5) | 2024.11.14 |