Swift - fallthrough와 defer

이재원·2024년 7월 5일
0

Swift

목록 보기
6/13
post-thumbnail
post-custom-banner

Fallthrough

Swift에서 switch 구문은 각 케잇의 맨 아래에서 다음 케이스로 넘어가지 않습니다. 만약 C언어에서처럼 다음 케이스로 넘어가려면 fallthrough 키워드를 사용하면 됩니다.

let integerToDescribe = 5
var description = "The number \(integerToDescribe) is"
switch integerToDescribe {
case 2, 3, 5, 7, 11, 13, 17, 19:
    description += " a prime number, and also"
    fallthrough
default:
    description += " an integer."
}
print(description)
// Prints "The number 5 is a prime number, and also an integer."

Defer

defer의 뜻은 미루다, 연기하다 라는 뜻을 가지고 있습니다. 따라서 말 그대로 함수 내에서 자신의 실행을 맨 마지막으로 미루는 역할을 합니다.

아래는 공식 문서에 작성되어 있는 예제입니다.

var score = 3
if score < 100 {
    score += 100
    defer {
        score -= 100
    }
    // Other code that uses the score with its bonus goes here.
    print(score)
}
// Prints "103"

위 예제에서는 defer은 if 구문 내에서 실행 마지막으로 미뤘기 때문에 -100이 된 값이 출력되지 않고 103이 출력된 것을 확인할 수 있습니다. 여기서 if 바깥에 score을 출력해 보면 3이 출력되는 것을 확인할 수 있습니다.

var score = 3
if score < 100 {
    score += 100
    defer {
        score -= 100
    }
    // Other code that uses the score with its bonus goes here.
    print(score) // Prints "103"
}
print(score) // prints "3"

마지막으로 실행이 밀린 defer이 실행된 후 if 구문이 종료되었기 때문입니다.

Defer의 특징

1. defer를 일기 전에 함수가 종료되면 defer는 실행되지 않습니다.

2. 하나의 함수에서 여러 번 defer 호출이 가능하며, 실행 순서는 가장 마지막 defer부터 실행됩니다.

if score < 10 {
    defer {
        print(score)
    }
    defer {
        print("The score is:")
    }
    score += 5
}
// Prints "The score is:"
// Prints "6"

stack으로 쌓인다고 생각하면 되는데, 첫번째 defer가 스택에 쌓이고 나머지 defer가 스택에 쌓이면 두번째로 쌓인 defer가 실행되고 첫번째 defer가 실행되는 구조입니다.

3. defer는 중첩해서도 사용 가능하며, 실행 순서는 가장 바깥쪽 defer부터 실행됩니다.

4. 만약 런타임 에러나 충돌로 인해 프로그래미 수행이 멈추면 연기된 코드는 수행되지 않습니다.

defer는 언제 사용할까요?

참고한 블로그를 보면 NSLock을 이용해 상호배제를 걸 때 함수가 종료되기 전에 Lock이 걸린 경우 이 Lock을 풀어주어야 데드락에 걸리지 않는데 이러한 경우에 사용된다고 합니다.

let myLock: NSLock = .init()

func fetchData() {
    myLock.lock()
    
    defer { myLock.unlock() }
    
    if data == nil { return }
    
    //이후 작업 ~.~
}

아직 NSLock을 사용할 경우가 없어 현재로써는 쓸 일이 없어 보이지만 알고 있다면 나중에 유용할 듯 싶습니다.

또한 SQLite3을 사용할 때도 defer를 사용해 함수가 종료될 때 DB를 닫아주는 경우에도 사용된다고 합니다.

출처
https://babbab2.tistory.com/80
https://bbiguduk.gitbook.io/swift/language-guide-1/control-flow

profile
20학번 새내기^^(였음..)
post-custom-banner

0개의 댓글