Swift

[Swift] 반복문 정리

Hatchling.dev 2023. 3. 16. 02:41

(편의상 편한 말투로 작성하는 점 이해 부탁드립니다.😅)

(부정확한 정보가 있을 수 있습니다. 지적 환영🤩)

 

오늘은 Swift의 반복문에 대해 알아보겠습니다~

반복문은 같은 로직을 반복하여 코드를 줄여주는 문법이라고 생각하시면 됩니당!

실제로 로직을 구현할 때 자주 쓰이니 익숙해지면 좋을 것 같습니당

반복문인 For문, While문을 알아보겠습니다.

 

For문

for문은 순회하거나 일정 횟수만큼 반복하기 위해 사용하는 문법입니다.

기본적인 사용 방법 예시는 아래를 참고해주세요.

let numbers = [1,2,3,4,5]

for number in numbers {
    print(number)
}

for index in numbers.indices {
    print(numbers[index])
}

for i in 0..<5 {
    print("안녕")
}

이 둘은 numbers의 요소들을 순서대로 출력하는 for문 입니다. 차이점은 요소를 직접 꺼내서 사용하느냐, numbers의 인덱스를 이용해서 사용하느냐의 차이입니다. 저는 각 상황에 따라 둘 다 많이 사용하는 것 같습니다.😀 세 번째는 일정 횟수만큼 반복하는 반복문입니다!

 

그럼 반복문은 무조건 모든 요소를 순회하거나 정해진 횟수만큼 실행을 해야하느냐!! 꼭 그런 것은 아닙니다. 그런 상황에 쓸 수 있는 방법들을 알아보겠습니다~

먼저 break입니다. 네 맞습니다. 반복문을 멈추는 키워드입니다. 아래를 참고해주세요!

아래 코드는 index가 2이하인 요소만 출력해주는 반복문입니다. index가 2보다 크다면 if에서 break를 만나 반복문을 종료합니다.

for number in numbers {
    if number > 2 { break }
    print(number)
}

 

그럼 다음은 continue입니다. 계속하다?? 무엇을 계속한다는 건지.. 쉽게 설명하면 반복문 안에 여러 로직들이 있을 텐데 로직을 실행하다가 continue를 만나면 그 뒤에 있는 로직들은 실행하지 않고 다음 요소로 건너 뛰게 해주는 키워드라고 생각하시면 됩니다!

이번에는 index가 홀수만 출력해보도록 하겠습니다! index가 짝수라면 continue를 만나 print문을 실행하지 않습니다!

for number in numbers {
    if number % 2 == 0 { continue }
    print(number)
}

 

이번에는 where입니다! 눈치 챘나요? 반복문을 실행하는 조건을 줄 수 있는 문법이라고 생각하시면 됩니다!

위에서 if문을 썼는데 간단한 조건이라면 where을 써보시는 것도 좋을 것 같습니다.😀

아래처럼 같은 결과를 얻는 반복문 두 개가 있습니다. 보시기에 어떠신가요? 두 번째 방법이 더 짧고 간단해 보이지 않나요? 반복문 자체에 조건을 걸고 싶다면 두 번째 방법을 사용하는 것도 좋을 것 같습니다만 로직 중간에 조건을 추가하지는 못하니 참고해주세요!

for number in numbers {
    if number % 2 == 0 {
        print(number)
    }
}

for number in numbers where number % 2 == 1 {
    print(number)
}

 

이제 기본 사용 방법을 알았으니 더 유용하게 사용할 수 있는 방법들을 알려드리겠습니다!

먼저 enumerated()입니다. enumerated가 무엇이냐!

위에서 요소를 꺼내는 방법과 인덱스를 사용하는 방법 두 가지를 알려드렸는데 이 둘을 동시에 사용할 수 있는 메서드라고 생각하면 됩니다!

코드로 보여드리면 아래처럼 사용할 수 있습니다.

let numbers = [1,2,3,4,5]

for (index, number) in numbers.enumerated() {
    print("\(index): \(number)")
}

 

다음은 reversed()입니다. 네! 거꾸로 배열을 거꾸로 정렬하는 메서드죠! for문에서도 사용하실 수 있습니다!

아래 코드를 실행하면 5 4 3 2 1이 순서대로 출력됩니다.

let numbers = [1,2,3,4,5]

for number in numbers.reversed() {
    print(number)
}

하지만 index를 반대로 사용하고 싶은 경우도 있을 수 있겠죠??

그 땐 stride(from:to:by)를 사용하시면 되는데 넣어야 하는 매개변수가 3개네요! from은 어디서 시작할지, to는 어디까지 실행할지, by는 얼만큼 더할지 넣으시면 됩니다.

참고로 stride(from:through:by:)도 있습니다! 둘의 차이는 to는 해당 수를 포함하지 않고 through는 포함합니다!

아래 코드를 참고해주세요!

for index in stride(from: numbers.count-1, to: 0, by: -1) {
    print(numbers[index])
}

for index in stride(from: numbers.count-1, through: 0, by: -1) {
    print(numbers[index])
}

첫 번째 반복문은 5 4 3 2 까지만 출력하고 두 번째 반복문은 5 4 3 2 1 모두 출력합니다! to는 0을 실행하지 않기 때문이죠!!

 

While문

while은 특정 조건이 true 일 때 반복하는 문법입니다!

for문과 가장 큰 차이점이라고 한다면 역시 순회 타입의 요소를 직접 꺼내 반복할 수 없다는 차이점이 있을 것 같네요. 하지만 순회 타입을 순회할 수 있는 방법도 있습니다! 아래 코드를 참고해주세요!

let numbers = [1,2,3,4,5]
var index = 0

while true {
    print(numbers[index])
    index += 1
    if index >= numbers.count { break }
}

while index < numbers.count {
    print(numbers[index])
    index += 1
}

위의 두 코드는 같은 기능을 하는 두 while문 입니다.

for문과 다르게 요소를 직접 꺼낼 수 없기 때문에 별도 index를 담을 변수를 밖에 선언해줘야 한다는 차이점이 있죠??

while문은 조건이 true일 때 실행되기 때문에 조건에 true를 넣었다면 무한반복을 하기 때문에 무조건 반복문 안에서 반복문을 탈출할 수 있도록 해줘야 합니다!! 위에서 배운 break 및 continue 모두 쓸 수 있습니다!

 

Repeat-While문

다른 언어의 Do-While문이라고 생각하시면 됩니다. 처음 한 번은 무조건 로직을 실행한 후에 조건이 맞는지 검사하여 조건이 맞으면 반복하는 문법이라고 생각하시면 됩니다! 아래는 예시 코드입니다.

let numbers = [1,2,3,4,5]
var index = 0

repeat {
    print(numbers[index])
    index += 1
} while index < numbers.count

index = 3

repeat {
    print(numbers[index])
    index += 1
} while index < 2

첫 번째 repeat-while은 위의 while문과 같은 결과를 출력합니다. index가 0부터 시작해서 numbers.count인 5보다 작을 때까지 반복하죠.

하지만 두 번째 repeat-while문 전에 index를 3으로 설정해주고 index가 2보다 작을 때만 반복하는 조건을 넣어줬습니다. 결과는??? repeat-while은 조건을 검사하기 전에 무조건 한 번은 코드를 실행하기 때문에 numbers[3]에 있는 4를 출력하고 반복문을 종료합니다.

만약 저 index에 3을 대입하는 코드를 지운다면 어떻게 될까요?? 먼저 실행된 repeat-while문에서 index가 5가 된 상태에서 numbers[index]를 출력하려고 하니 에러가 발생합니다!

이처럼 무조건 한 번이상 실행되기 때문에 발생할 수 있는 에러들이 있기 때문에 잘 사용하는 것이 중요할 것 같네요🥲

 

 

오늘은 다양한 반복문에 대해 알아보았습니다!

방법도 다양한 만큼 실제로 사용할 때도 필요에 따라 다양하게 사용하게 되니 잘 알아두면 좋을 것 같네요!!

사실 forEach도 같이 정리하려고 했지만 너무 길어질 것 같아 나중에 따로 정리하도록 하겠습니다😄

'Swift' 카테고리의 다른 글

[Swift] 구조체(Struct)란?  (0) 2023.06.08
[Swift] Optional이란?  (0) 2023.06.05
[Swift] 조건문(if-else, switch)과 삼항연산자, if let, guard let  (0) 2023.03.08
[Swift] Functions(함수) 정리  (0) 2023.03.07
[Swift] Collection Type?  (0) 2023.03.05