ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • What's new in Swift (feat. WWDC 2026)
    Swift 2026. 6. 22. 14:00

    안녕하세요. 그린입니다🍏

    이번 포스팅에서는 얼마전 진행되었던 WWDC 2026에 대해 이제 하나씩 정리해보고자 합니다 🙋🏻

    첫번째 시작은 What's new in Swift에요.

    WWDC 2026에서 소개된 Swift 변화에 대한 핵심적인 것들을 세션을 보며 정리해보겠습니다 🚀

    특히 Swift 6.3과 Swift 6.4 기반에서 변화된 정리 내용이 주입니다.

     

    Swift의 새로운 기능 - WWDC26 - 비디오 - Apple Developer

    Swift 관련 업데이트를 확인해 보세요. 일상적인 인체공학, 향상된 동시성, 더 안전한 고성능 코드를 위한 업데이트 등 언어 관련 최신 혁신 기술을 알아보세요. Embedded Swift의 워크플로와 언어 상

    developer.apple.com

     

    우선 개선사항들부터 살펴볼까요?

    Improvements

    옵셔널 타입

    이전에는 some이나 any와 옵셔널을 같이 사용할때는 이렇게 괄호로 묶어야 됐어요.

    이는 연산자 우선순위 규칙 관련해서 필수였습니다.

     

    이제는 아래와 같이 컴파일러가 똑디하게 판단해주기에 묶지 않아도 되게 되었습니다.

    Swift 6.4부터요.

     

    Concurrency

    이제 이 컨커런시 관련하여 오류를 무시하면 경고가 나타납니다.

     

    그래서 이제는 이렇게 작업 내 오류를 처리하거나,

     

    이렇게 작업을 저장해두었다가 나중에 처리하던가 해야 합니다.

     

    이제 defer block에서 async 함수를 호출하던 제한도 사라졌습니다.

     

    @Unchecked Sendable을 사용하던 클래스는 weak var 프로퍼티 때문이였을텐데요.

    이제 weak let으로 설정한다면 @Unchecked를 붙이지 않아도 됩니다.

     

    그리고 만약 타입이 Sendable일 필요가 없다면, 새로운 tilde Sendable 구문으로 명시적으로 나타낼 수 있어요.

    서브 클래스가 Sendable이 되는것도 막지 않습니다.

     

     

    Access level

     

    internal과 private을 같는 등의 서로 다른 접근 레벨 프로퍼티를 가진 구조체는 이제 두번째 멤버와이즈 이니셜라이저를 가지게 되어 다른 프로젝트에서도 사용이 가능하게 됩니다.

     

    anyAppleOS

     

    이제 각 macOS, iOS 이렇게 다 나열할 필요없이 27 버전부터는 통일되었기에 이렇게 anyAppleOS로 통합해서 사용할 수 있습니다.

    가용성을 한번에 통합해서 주기에 편리하죠.

     

     

    물론 이렇게 통합하고 하나를 예외로 두는 설정도 가능합니다.

     

    @diagnose

     

    이렇게 디프리케이트된 API들은 경고가 뜨기 마련이죠.

    이제는 이 경고를 나타나지 않게 할 수 있습니다.

     

     

    요런식으로요!

    다른 부분에선 영향을 주지 않고 해당 선언된 부분에서만 경고를 끌 수 있어요.

     

    추가로 인자로, StrictMemorySafety를 주어 보안이 중요한 메서드에서 unsafe API를 사용했는지 감시할 수도 있고,

    ErrorInFutureSwiftVersion을 주어 특정 경고를 에러로 처리하는것도 가능합니다.

     

    Module Selectors

    Swift 6.3에서는 두 모듈에 동일한 이름의 API 있을때도 더 잘 처리하도록 해줍니다.

     

    같은 파일에 이렇게 두 모듈을 모두 임포트했다고 가정합니다.

    Swift는 원래 어떤걸 원하는지 몰라 에러를 내뱉어요.

    그래서 우리는 Rocket.SaturnV 이렇게 더 명확한 경로를 주어 사용했죠.

     

     

    그런데 만약 이렇게 Rocket 모듈안에 Rocket 타입이 있다면?

    Swift는 모듈 이름보다 타입 이름을 더 우선시합니다.

    그래서 protocol에서 SaturnV를 찾게 되는것이죠.

    없으면 당연히 에러가 나겠죠?

     

    그래서 Swift 6.3에서는 더블 콜론 문법을 도입했습니다.

     

    이렇게 ::으로 경로를 지정하게 되면 모듈을 보게 됩니다.

    모듈 셀렉터라고 불러요.

     

     

    이건 이렇게 메서드나 프로퍼티에서도 사용이 가능합니다.

     

    많이 유용할것 같아요 👍

    예를들어 SwiftUI에서 View 타입이 있는데, 모듈 이름도 View로 짓거나 하고 싶을 수도 있기에 이럴때 선택지가 없었는데 매우 도움이 될것 같습니다.

     

    이제는 Swift 언어에 대한 개선 혹은 신규 사항들을 살펴봤으니, 다음으로 라이브러리에 대한 새로운 사항들을 살펴볼까요? 😃

    Libraries

    Standard Library

    이제 Task 취소 쉴드 기능을 사용할 수 있어요.

    쉴드 내부에선 작업 취소 확인이 항상 false로 반환됩니다.

    이미 시작한 작업을 완료하거나 롤백하는데 중요시 생각해야 합니다.

     

    해당 mapKeyedValues가 생겼어요.

    이걸 활용하면 키와 이전 값 모두 매핑 클로저에 전달해 새 값을 계산할 수 있죠.

     

    플랫폼 마다 파일 경로를 나타내는것이 다를 수 있죠.

    올바르게 처리하기 까다로울 수 있습니다.

    이제는 Swift System의 타입을 기반으로 표준 라이브러리에 새로운 filepath 타입을 추가해 더욱 적절히 사용할 수 있게 되었습니다.

     

    Testing

    Swift 6.4의 테스팅은 테스트 동작에 대한 더 많은 제어권을 제공합니다.

     

    Issue.record를 통해 치명적이지 않은 이슈들은 그냥 워닝으로만으로 설정할 수 도 있죠.

    CI 워크플로우를 방해하지 않게 됩니다.

     

    그리고 Test.cancel API가 생겨서 테스트를 동적으로 취소할 수도 있어요.

     

    Swift test 명령어에 테스트를 반복하는 새로운 기능도 생겼습니다.

     

    Swift Test로 사용되는것들도 상호운용성 덕에 XCTest에서도 동일하게 사용할 수 있습니다.

     

    Subprocess

    지난해 Subprocess 패키지를 애플이 발표했어요.

    쉽게 서브프로세스를 실행 시키기 위한 API를 포함한 패키지죠.

    올해 Subprocess 1.0을 출시합니다.

     

     

    피드백을 중점으로 여러 사항들이 개선되었습니다.

    특히 크로스 플랫폼 지원도 강력해졌어요.

     

    예시로, 서브프로세스를 실행하기 위해 run 메서드를 호출할 때 표준 출력과 표준 오류 스트림을 AsyncBufferSequence로 실행 객체에 포함할 수 있어요.

    이 모델은 각 스트림이 단 한번만 생성됨을 보장합니다.

    strings() 메서드로 서브 프로세스를 라인 바이 라인으로 쉽게 읽을 수 있도록 보장해줍니다.

     

    Foundation

    ProgressManager라는게 Foundation 라이브러리 내에 생겼습니다.

    진행 상황 보고를 위한 새 타입이죠.

    Swift Concurrency로 설계되고 구조화되었습니다.

     

     

    또한, Foundation에서 Data 부분도 더 개선되어 빨라졌습니다.

    Data와 NSData의 브릿징도 감소되었고 NSURL과 CFURL도 Swift에서 통합되었어요.

     

    이런 큰 Foundation을 개선할 수 있는건 Swift의 언어 상호운용성 덕분에 가능하죠.

     

     

    언어의 경계를 넘어 의미있는 크로스 플랫폼의 언어로 진화하고 있죠.

     


    Full-stack Swift

    Interoperability

    Swift는 정말 어떤 분야도 막힐게 없는 풀스택 언어가 되었습니다.

    특히 Swift 6.4에서는 언어 상호 운용성을 더 극대화 했습니다.

    크로스 플랫폼 IDE 지원을 개선하고 더 쉽고 안전하게 웹이나 임베디드 기기와 같은 다른 환경에 Swift 코드를 가져갈 수 있게 합니다.

     

    Swift 6.4는 Swift로 작성된걸 C에 노출할 수 있게 합니다. (반대는 이미 가능했어요.)

     

     

    이렇게 @c를 통해 사용할 수 있죠.

     

     

    @c와 @implementation 어노테이션을 사용하면 별도 C 선언 없이도 C 함수 구현이 가능합니다.

    원래 헤더 파일에 이미 선언되어 있었으니까요.

    만약 원래 C 헤더에 선언되어 있지 않았던거라면 @c만으로 충분하고 @implementation을 사용하지 않아야 합니다.

     

    이렇듯 Swift의 상호 운용성은 다른 언어로 작성된 코드 베이스에 Swift를 도입하는데 핵심입니다.

     

     

    Swift-Java는 Swift와 Java 사이 상호 운용성을 가능케 하는 패키지입니다.

    Java에서 async와 throwing Swift 함수 호출을 할 수 있게 지원해줍니다.

    그 외 Java 클래스를 Swift 프로토콜에 적합하게 만드는것도 가능하고요.

    즉 이제, Java, Kotlin 환경에서 Swift 함수를 호출하는것이 자연스러워진것입니다 🙌

     

    Editor Support

    VSCode용 Swift 익스텐션 최신 버전이 Swiftly와 새로운 통합을 추가합니다.

    에디터에서 바로 swift.org의 툴체인을 쉽게 받아볼 수 있어요.

    이제 어떤 에디터든 정확한 툴체인을 받아 볼 수 있죠.

     

    Wasm

    오픈 소스 툴체인으로 Web Assembly로 컴파일 할 수 있습니다.

    Swift의 Wasm 지원은 동일한 언어로 네이티브 앱을 작성하고 BE, FE 모두 작성할 수 있는것이죠.

     

    Embedded

    더 제한된 환경에서도 Swift의 편의성을 활용할 수 있습니다.

     

    임베디드 Swift는 이제 existential 타입을 지원합니다.

    프로토콜을 준수하는 여러 타입을 사용할 수 있게 된거죠.

     

    Swift 6.4는 필요한 모든 메타 데이터를 DWARF 디버그 정보에 저장합니다.

    임베디드 Swift 코어 덤프 디버깅 경험에 도움을 주죠.

     

    이제 Swift 성능을 극대화하는 방법들을 들어볼까요?

     


    Performance ergonomics

    Optimizer controls

    Swift 컴파일러의 optimizer는 코드를 더 빠르게 만들기 위해 수십 가지 기법을 적용합니다.

    그치만 잘못 적용하면 오히려 역효과가 날 수도 있죠.

     

    예를들어, 컴파일러가 수행하는 가장 최적화중 하나는 인라이닝입니다.

    함수 호출 코드 위치를 대체하고 특정 위치에 맞게 최적화하는거죠.

    만약 역효과가 난다면 더 빨라지진 않고 바이너리만 크게 만들 수 있죠.

     

    그래서 이게 효과적일지를 판단하기 위해 함수와 호출 위치를 분석해요.

    때론 잘못 판단할 수도 있기에 강제로 적용하는게 필요할 수 있습니다.

     

     

    Swift 6.4에서 @inline(always) 기능이 생겼습니다.

    기존에는 @inline(never) 속성만 있었고 대부분 이게 권장되었었는데 이제는 명시적으로 필요할 수 있다는걸 의미하는거죠.

    그래서 이걸 사용할 때 웬만하면 final 키워드와 같이 사용하는걸 권장합니다.

     

    또 다른 최적화는 특수화입니다.

    이렇게 제네릭 오버헤드를 없애고 추가 최적화를 가능하게 해줍니다.

     

    하지만 때론 라이브러리에서 컴파일러가 함수를 어떻게 사용할 지 모를 수 있기에, 이를 직접 제어하기 위해 @specialized 어노테이션을 붙여 사용할 수 있습니다.

     

    Ownership enhancements

    가장 큰 성능 향상을 이룬 개선을 살펴보겠습니다.

    바로 소유권 시스템입니다.

     

    Swift의 성능 문제는 대부분 복사 때문에 코스트가 발생하죠.

     

     

    이런식은 다들 너무 잘 알거기에 긴 설명이 필요 없습니다.

    복사로 인해 성능 저하를 해결하는 방법은 특정 상황에서 복사가 필요없다는걸 인식해야 해요.

     

    이렇게 복사를 피해 데이터를 객체에 넣어 그 객체를 다른 컴포넌트에 전달하는 방식으로도 할 수 있죠.

    대부분의 경우는 해결할 수 있지만 모든 경우는 아니에요.

    객체에 참조 카운트가 있어 전달하면 참조 카운트가 변경되기에 그렇죠.

     

     

    그래서 요즘 방식은 Borrow를 이용하는 겁니다.

    컴포넌트 2가 저장소 자체를 빌리는 동안은 컴포넌트 모두 읽기만 가능하고 쓸 순 없어요.

    컴포넌트 2가 먼저 끝내야 컴포넌트 1이 제어권을 가지게 됩니다.

     

     

    Mutate도 있는데, 다른 컴포넌트가 저장소에 접근하는것 자체도 완전 차단됩니다.

     

     

    이렇게 연관 타입도 이제 복사 불가능, 이스케피이 불가능 등을 지정할 수 있어요.

     

     

    복사 없이 for문 안에서 반복이 가능합니다.

    Sequence처럼 Iterable은 이터레이터를 생성해 for문이 요소를 가져오도록 합니다.

    하지만, 시퀀스하곤 달리 요소들을 배치로 가져옵니다.

     

     

    또한, borrow, mutate라는 새로운 접근제어자가 생겼어요.

    borrow는 공유 저장소에 대한 읽기 전용으로 동작합니다.

    복사 없이요.

    mutate는 수정도 가능합니다.

    위에 우리가 살펴봤던것과 동일해요 😁

     

     

    또한 성능을 위한 대체 API들도 나왔으니 적극 활용해보면 좋을것 같아요.

     

     

    Ref와 MutableRef 타입을 통해 저장소에 접근도 제어할 수 있어요.

     

    이전에는 이런식으로 활용되었죠.

    inout을 통해서 말이죠.

     

    이제는 MutableRef를 사용하여 보다 간단하게 표현할 수 있습니다.

     


    Conclustion

    이렇게 이번 WWDC 2026에서 소개된 Swift 파트를 살펴봤습니다 🙌

    그렇게 큰 변경이나 그런건 없어보여요.

    틈틈히 Swift 6.3, Swift 6.4 릴리즈에 대한것들을 정리하고 살펴본적이 있어서 그런지 리캡 느낌이였습니다.

    그래도 성능 부분에서 어떻게 언어적으로 잘 쓸 수 있는지에 대해 고민해보게 되고, 크로스 플랫폼 언어로 진화됨에 따라 앞으로는 더욱 포지션 별, 플랫폼 별 구분이 사라지는데 제약이 없을것 같다고 느껴지네요.

     


    References

     

    Swift의 새로운 기능 - WWDC26 - 비디오 - Apple Developer

    Swift 관련 업데이트를 확인해 보세요. 일상적인 인체공학, 향상된 동시성, 더 안전한 고성능 코드를 위한 업데이트 등 언어 관련 최신 혁신 기술을 알아보세요. Embedded Swift의 워크플로와 언어 상

    developer.apple.com

Designed by Tistory.