Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

defer란 무엇인지 설명하시오. #25

Open
Do-hyun-Kim opened this issue Oct 30, 2023 · 4 comments
Open

defer란 무엇인지 설명하시오. #25

Do-hyun-Kim opened this issue Oct 30, 2023 · 4 comments
Labels
Swift Swift CS 개념 공부

Comments

@Do-hyun-Kim
Copy link
Contributor

No description provided.

@Do-hyun-Kim Do-hyun-Kim added the Swift Swift CS 개념 공부 label Oct 30, 2023
@Do-hyun-Kim
Copy link
Contributor Author

defer란 무엇인지 설명하시오.

Defer Statement

  • defer Statement 는 함수 안에 작성 되는 non-escaping closure이며 함수 작성된 위치와 상관없이 함수가 종료되기 직전에 실행 되는 구문이다.
  • defer 구문은 후 처리 방식을 할 때 사용되며 함수 scpoe 범위 내에서 가장 마지막에 실행이 된다.
  • defer 구문을 중첩으로 사용 할 수 있으며 LIFO 형식으로 가장 마지막에 있는 defer 가 먼저 실행되고 가장 처음에 있는 defer 가 마지막에 실행된다.
  • defer 구문 내부에는 break, return, throw 등과 같이 구문을 빠져나갈 수 있는 코드 또는 오류를 던지는 코드를 작성하면 오류를 발생한다.
defer {
    <#statements#>
}


func sayNumber() {
    defer {
        print("print check : 1")
    }
    print("print check : 2")
}

//print check : 2
//print check : 1

func sayCheckNumber() {
    defer {
        for i in 0..<5 {
            print("for loop check : \(i)")
        }
    }
    print("print check : 5")
}

// print check : 5
// for loop check : 0
// for loop check : 1
// for loop check : 2
// for loop check : 3
// for loop check : 4


func sayNestedNumber() {
    defer {
        print("print check : 1")
    }
    
    defer {
        print("print check : 2")
    }
    
    defer {
        print("print check : 3")
    }
    print("print check : 4")
}


// print check : 4
// print check : 3
// print check : 2
// print check : 1

Defer 호출 되지 않는 경우

  • defer 를 읽기전에 함수가 종료 return 되면 defer 가 실행되지 않으며 throw error 가 발생해도 동일하게 defer가 실행되지 않는다.
  • guard 구문과 같은 defer 를 읽기 전 함수를 종료 시킬 수 있는 구문이 있다면 실행이 안 될 수도 있다.
  • 함수 리턴 값이 Never 값일 경우 에러가 발생하면서 함수를 반환하지 않고 실행을 종료하기 때문에 defer가 호출되지 않는다.

Defer를 사용하는 경우

  • 함수가 종료하기 직전에 정리해야할 변수나, 상수를 처리해야할 용도로 사용한다.
  • deferNSLock 클래스를 통해 멀티 스레딩 환경에서 Thread-Safe 하게 작업을 할 수 있도록 도와주며 deadlock 을 방지 할 수 있기 때문에 함수 종료 직전에 DB 등을 닫아주는 용도로 사용하면 보장을 받을 수 있다.

📝 참고 사이트

@vichye-1
Copy link

vichye-1 commented Nov 1, 2023

defer란?

  • 함수 안에서 작성되는 클로저
  • 작성된 위치와 상관 없이 함수 종료 직전에 실행된다.
  • 함수의 맨 마지막에 실행된다.
  • 형식
defer {
    //statements
}

defer가 사용되는 곳

  • 함수를 종료하기 직전에 정리해야 하는 변수나 상수를 처리하는 용도

    • NSLock을 이용해 상호배제를 걸 때 함수가 종료되기 전에 Lock이 걸린 경우, Lock을 풀어주어야 데드락에 걸리지 않음(Thread-safe). 함수가 종료되는 시점마다 Lock을 풀어주는 코드를 추가하는 것보다 defer를 사용하면 알아서 종료되기 전에 Lock을 풀어주어 간편하다.
    var money = 1000
    let lock = NSLock()
    
    DispatchQueue.global().async {
        buy()
    }
    
    DispatchQueue.global().async {
        buy()
    }
    
    func buy() {
        lock.lock();
        defer { lock.unlock() }
        money = money - 100
        print(money)
    }
    
    /* 결과
    900
    800
    */

출처

@ronick-grammer
Copy link
Contributor

defer란

블록 내에서 작성된 위치에 상관없이 함수 종료시점에 실행되도록 하는 클로저이다.

func ...() {
 defer {
   print("world")
 }
 print("hello")
}
// 결과
// hello
// world

📝 참고 사이트

@Hminchae
Copy link
Member

Hminchae commented Nov 9, 2023

defer 란

  • 함수 안에서 작성되는 클로저
  • 작성된 위치와 상관 없이 함수 종료 직전에 실행됨
  • 함수를 종료하기 직전에 정리해야 하는 변수나 상수를 처리하는 용도

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Swift Swift CS 개념 공부
Projects
None yet
Development

No branches or pull requests

4 participants