Skip to content

[기술 공유] Swift의 전역 변수 초기화 시점

00me edited this page Nov 28, 2024 · 1 revision

문제 상황

Swift Concurrency를 공부하며 스레드 안전성을 알아보던 중 흥미로운 얘기를 듣게 되었다.

let logger = Logger(
    subsystem: "com.example.apple-samplecode",
    category: "Root View"
)

위 전역변수 logger 코드는 언제 실행될까 ??

전역변수니까 시작 시점에 초기화가 될까 ?

답은 아니다. 왜 그런지 알아보자


문제 해결

C언어와 Objective-C의 전역변수

C언어와 Objective-C에서의 전역변수는 시작 시점에 초기화가 되는 게 맞다.

그러나, 프로그램 시작 시간에 아주 나쁜 영향을 줄 수 있는 동작이 된다.

Swift의 전역변수

Swift는 위 문제점을 인지하고 방지하고자 전역변수를 지연(= lazy) 초기화로 사용한다 !

즉, 전역변수로 선언된 값을 처음으로 사용할 때 초기화가 된다는 뜻이다.

이로인해 앱이 더 빠르게 사용가능한 상태가 될 수 있게 한다.

Swift에서 전역변수는 Lazy 하니까 두 스레드가 동시 접근하면 Data Race가 발생할까 ?

두 스레드가 동시에 접근하려하면 한 스레드만 초기화되고 하나는 블로킹되어 대기 상태가 된다 ~

Swift의 전역변수는 신이네요


배운 점

  • Swift의 전역변수는 Lazy하게 초기화된다.
  • Swift의 전역변수는 동시성도 알잘딱 제공해준다.

참조 링크

아래 WWDC 15~16분쯤부터 17:05까지 나옵니다.

https://developer.apple.com/videos/play/wwdc2024/10169

Clone this wiki locally