Swift 6로 프로그래밍하기 위하여 알아야할 기본 상식에 대해서 적어 보도록 하겠습니다.
Swift 6은 기존 버전과는 다르게 실행이 태스크 블록 단위로 멀티쓰레드에서 실행됩니다. 이것은 디버깅시 다양한 쓰레드의 콜스택에서 확인할 수 있습니다. 그리고 이것은 다른 언어들과는 다르게 언어 레벨에서 지원하며 데이터 경합에 의한 문제는 컴파일시에 체크된다는 점입니다. 컴파일시 체크된다는 것은 어떻게 작성하든 컴파일러가 검증해준다는 의미가 아닙니다. Swift 6에서 언어적으로 지켜야할 방법에 따라 프로그래밍해야 한다는 점입니다. 실제로 언어에 맞게 작성하게 되면 실행 선후 관계의 문제는 발생해도 데이터 경쟁에 따른 문제가 발생하지는 않습니다.
Swift 6를 사용하게 되면 Task 블록을 많이 사용하게 됩니다. 이 Task 블록은 함수가 실행된 후에 임의의 쓰레드에서 실행된다는 것을 의미합니다. 함수에서 사용할 때 조심해야 할 점은 Task 블록은 함수가 종료된 후에 임의의 쓰레드에서 실행되기 때문에 실행의 선후 문제를 발생시킬 수 있습니다. 그러므로 실행단위에 맞게 Task 블록을 잘 설정해야 합니다.
Swift 6에서 class는 쓰레드 안정성을 갖지 않기 때문에 쓰레드 안전성을 갖기 위해서는 actor로 프로그래밍되어야 합니다. 물론 메인쓰레드에서만 실행되는 거라면 class 앞에 @MainActor로 지정하고 프로그래밍하는 것도 가능하고 ViewController와 같은 기본 라이브러리의 UI 클래스는 이렇게 되어 있습니다. 어떻게 보면 그냥 모든 쓰레드에서 실행시키기 위해서 기존 class를 actor로 바꾸면 되지 않겠냐고 쉽게 생각할 수 있습니다. 그런데 class는 상속을 지원하지만 actor는 상속을 지원하지 않습니다. 저와 같은 경우 모든 쓰레드에서의 실행을 보장하기 위해서 일부 기존 class를 actor로 변경해야 했는데 이 부분에서 기존 클래스들이 class 상속을 이용하는 부분이 많아서 actor로 만들때 해당 상황에 맞게 재디자인 해야 했습니다. 참고로 상속 관련 부분이 필요할 경우에는 Sendable을 상속 받는 protocol을 이용하여 재디자인 하였습니다.
Swift 6에서 Sendable를 이해해야 합니다. 이건 쉽게 말해서 함수 인자나 리턴값으로 사용할 수 있음을 의미합니다. 이것은 Sendable을 만족하는 struct, class, enum등이나 actor를 말합니다. 말은 이런데 실제적으로 class는 var타입의 멤버만 있어도 struct는 Sendable하지 않은 class만 있어도 만족하지 못합니다. 쉽게 말해서 actor만 Sendable하다고 보면됩니다. 나머지는 let한 변수만 갖는 등의 조건이 있지만 실제로는 이런 Sendable 조건은 사용할 일은 별로 없습니다. 참고로 struct에 actor가 있는 경우 Sendable관련 오류가 날 수 있는데 이건 struct가 Sendable을 상속하게 해주면 됩니다.
Swift 6에서 class의 사용은 조금 애매해집니다. 이유는 Sendable하지 않아서 @MainActor로 지정하여 메인쓰레드에서 사용하지 않는다면 철저하게 actor안에서만 사용해야 하기 때문입니다. 물론 UI만을 다루는 class는 @MainActor로 지정하여 메인쓰레드에서만 실행시켜서 기존처럼 사용할 수 있습니다.
Swift 6에서 await에 대해서 알아야 할 한가지 점은 단순히 해당 태스크 블록이나 비동기 함수의 실행이 끝나기를 기다리는 것만 하는 것이 아니라 같은 쓰레드 내의 다른 실행 블록으로 실행을 넘길 수 있다는 점입니다. 이걸 모르면 ViewController에서 await하는 동안 다른 부분이 실행될 때 발생하는 선후 관계 오류를 잡을 수 없게 됩니다.
Swift 6에서 기존 Swift 버전의 작업을 업데이트할 때 까다로운 점의 하나는 기존 Hashable 같은 기존 라이브러리를 사용하기 위해서 필요한 동기적 프로토콜을 actor에 구현해야할 때입니다. 이때는 nonisolated 등을 이용하여 이 부분은 동시성 격리를 포기하고 안전하게 사용할 수 있게 구현해야 합니다. 이 외에 내부적으로 sort등의 동기적 함수만 이용해야 할 때는 비동기 sort를 별도로 구현해야 합니다. 하다보면 기존 라이브러리가 동기적인 호출만을 지원해서 actor와 같은 비동기적 호출을 지원하지 않아서 별도로 구현해야 하는 부분이 많이 나오는데 이 부분은 인터넷 검색이나 AI등을 활용하여 처리하면 됩니다.
'iOS 프로그래밍' 카테고리의 다른 글
Swift 6을 프로젝트에 적용한 후에... #3 마치며... (0) | 2025.07.03 |
---|---|
Swift 6을 프로젝트에 적용한 후에... #1 시작 (0) | 2025.07.03 |
SWIFT 디버깅시 유용한 API (0) | 2023.12.27 |
SwiftUI 다크 모드 지원 : 모드 변경시 색상 자동 변경 (0) | 2022.10.18 |
iOS 시뮬레이터에서 터치 동그라미 보이게 하기 (0) | 2022.03.17 |