[Swift] 반복문에 대해 알아보자

안녕하세요~ 차니에요!

 

오늘은 지난 조건문편에 이어서 반복문에 대해 알아보도록 하겠습니다~

반복문은 말 그대로 무언가를 반복하는 명령어입니다.

 

반복문에서는 continue와 break를 통해 반복 제어가 가능합니다.

  • continue : continue 아래 코드를 실행시키지 않고 다음 반복을 시작함
  • break : 반복문을 멈춤

 

* 샘플 데이터

struct Person {
    var name: String
    let age: Int
    let gender: Gender
    
    enum Gender{
        case male, female
    }
}

지난 시간에 사용했던 데이터를 더 추가해서 사용해보겠습니다.

let channy = Person.init(name: "channy", age: 28, gender: .male)
let andrew = Person.init(name: "andrew", age: 22, gender: .male)
let linda = Person.init(name: "linda", age: 25, gender: .female)
let betty = Person.init(name: "betty", age: 34, gender: .female)
let brian = Person.init(name: "brian", age: 30, gender: .male)

let memberList: Array<Person> = [channy, andrew, linda, betty, brian]

회원 목록에 5명의 가상 인물을 대입하였습니다.

 

1. for-in

for {item} in {items}
for member in memberList {
    print(member.name)
}

items에는 순회할 Array, Dictionary 등이 들어가고 item에는 items[startIndex] ~ items[endEndex]까지 값이 대입되며 순회합니다.

전체 회원 이름을 출력하였습니다.

그렇다면 요소뿐만 아니라 인덱스까지 사용하고 싶은 경우 for-in 사용법은 어떻게 될까요??

 

1-1. enumerated

Apple Documents의 enumerated 내용입니다.

(n, x) 쌍의 시퀀스를 반환한다고 나와있습니다.

n은 index, x는 element로 사용할 수 있습니다.

for (i, mem) in memberList.enumerated() {
    print("\(i) : \(mem.name)")
}

index, element 모두 출력되는 모습입니다.

1-2. indices

컬렉션의 인덱스를 오름차순으로 반환한다고 나와있습니다.

for i in memberList.indices {
    print("\(i) : \(memberList[i].name)")
}

memberList의 인덱스를 차례로 가져와서 이름을 출력해주었습니다.

실행 결과는 1-1과 동일합니다. 

 

1-3. count

for i in 0..<memberList.count {
    print("\(i) : \(memberList[i].name)")
}

모든 컬렉션의 시작 인덱스는 0인 점을 고려해 0부터 memberList의 크기(count)만큼 순회해주었습니다.

마찬가지로 1-1~3의 실행 결과는 동일합니다.

 

세 개 다 같은 역할을 하니 편한 방법으로 골라서 쓰시면 될 것 같습니다!

 

2. forEach

for-in과 동일한 루프로 각 요소의 클로저를 호출한다고 되어있습니다.

클로저에 대한 부분은 다음에 시간내어 포스팅하도록 하겠습니다.

지금은 사용법과 특징 정도만 이해해주세요!

memberList.forEach({
    print($0.name)
})

그렇다면 forEach에서 index는 어떻게 사용할까요?

for-in에서 썼던 enumrated()를 활용해보겠습니다.

memberList.enumerated().forEach({
    print("\($0.offset): \($0.element.name)")
})

이렇게 사용하면 offset에 index를, element에 요소를 가져와서 쓸 수 있게 됩니다.

 

 

3. for-in과 forEach의 차이

근본적으로 for-in은 반복문이고 forEach는 클로저라는 차이가 있습니다.

  • for-in에서는 continue, break가 사용 가능하지만 forEach에서는 불가능합니다.
  • for-in에서 return은 함수의 종료를 의미하지만, forEach에서는 클로저의 종료를 의미합니다.
func forIn() {
    for (i, member) in memberList.enumerated() {
        print("forIn :: \(i)")
        if member.age < 30 { return }
    }
}

for-in에 대한 코드입니다. 위 코드의 실행 결과가 예측되시나요?

더보기
첫 멤버의 나이가 28이라서 함수가 종료되었습니다.

func forEach() {
    memberList.enumerated().forEach({
        print("forEach :: \($0.offset)")
        if $0.element.age < 30 { return }
    })
}

이번엔 forEach에 대한 코드입니다.

더보기
해당 요소의 클로저만 종료될 뿐 반복문은 계속해서 진행됩니다.

4. while

var sum:Int = 0

while sum < 10 {
    sum += 1
    print(sum)
}

while문의 조건이 참(true)인 동안 반복되는 반복문입니다.

조건문의 결과를 보고 실행하기 때문에 조건에 따라 실행이 안 될 수도, 무한히 반복될 수도 있다는 특징이 있습니다.

 

5. repeat-while

repeat {
    sum += 1
    print(sum)
} while sum < 10

마찬가지로 while문이 참(true)인 동안 반복되는 반복문입니다.

다만 while문과 달리 조건문의 결과값에 상관없이 최초 1회는 무조건 실행된다는 차이점이 있습니다.

 

도움이 되셨다면 좋겠습니다.

공감 한 번씩 눌러주세요!