반갑습니다 집주인들 팀원 박효준입니다!
본편에서는 동시성에 대해 알아보다가 "Swift의 전역 변수 초기화 시점"의 신기한 점을 알게되어 공유드리고자 합니다!
그럼 바로 시작하겠습니다~~
문제 상황
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까지 나옵니다.
'Swift' 카테고리의 다른 글
Unit Test 할 때 @testable의 역할이 뭘까? (0) | 2024.12.06 |
---|---|
Test가 Serial하지 않군요! (0) | 2024.12.01 |
XCTest vs Swift Testing (0) | 2024.11.30 |
디버깅할 때, print가 아닌 OSLog 사용을 위한 Logger 구현 (0) | 2024.11.23 |
카메라 및 사진 권한 에러 (1) | 2024.11.21 |