관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 2. WWDC2024 정리 - (2) What's new in Swift (Swift의 새로운 기능, ~Copyable, Embedded Swift, C++ interoperability, Typed Throws, Data-race safety) 본문

WWDC 정리/WWDC 2024 정리

[iOS - swift] 2. WWDC2024 정리 - (2) What's new in Swift (Swift의 새로운 기능, ~Copyable, Embedded Swift, C++ interoperability, Typed Throws, Data-race safety)

jake-kim 2024. 6. 17. 01:45

Swift 저장소

  • Swift의 레포는 원격 저장소는 github을 사용하고 있으며, 기존에는 github.com/apple/* 형태로 관리되고 있었음

기존 swift관련 깃헙 주소

  • 이제 swift는 github.com/swiftlang 주소로 이전될 것

https://github.com/swiftlang

Swift 언어 업데이트 - 1) Noncopyable types (~Copyable)

  • swift에서 value타입이나 reference타입이나 모두 복사가 가능
    • Noncopyable types는 이 기본 복사 가능성을 막아주는 역할
    • 고유한 소유권을 표현하고자 할 때 적합한 키워드
  • 만약 파일 시스템에 접근하는 File 구조체가 있을 때 ~Copyable을 키워드를 사용
    • deinit될 때, 초기화 해제 기능을 사용하여 복사할 수 없는 구조체로 표현
    • 동일한 File에 대한 곳에서 접근할 때 런타임 문제를 방지해줌
    • memory leak도 방지 가능
    •  

  • 위처럼 작성하고 사용하는 곳에서 아래처럼 사용하면 문제가 발생하는것을 주의
    • open하여 fd라는 파일을 열고, File에 fd인스턴스를 주입하기전에 중간에 exit되거나 throw되면 File구조체의 deinit이 실행될 여지가 없어서 fd 파일이 닫히지 않아 memory leak이 발생

  • File 구조체의 생성자에서 파일을 직접 열고, 닫는 기능 모두 담당하도록 기능을 위임하면 안전하게 코드 유지가 가능
    • 특히 File 시스템은 복사 비용이 큰데, 이런점에서도 ~Copyable을 유용하게 적용이 가능
    • 왼쪽 화면처럼 init? 에서 파일을 오픈하도록 구현

  • 이 밖의 더 구체적인 Noncopyable types 개념은 이후 작성될 포스팅 글인 WWDC2024, Consume noncopyable types in Swift 세션 참고

Swift 언어 업데이트 - 2) Embedded Swift

  • 기존에는 적은 메모리 공간을 위해서는 C, C++을 사용하여 시스템에서 프로그래밍하는데 유리하기 때문에 C와 C++을 Embedded 프로그래밍에 사용했었음
  • 이제 Swift로도 Embedded 프로그래밍이 가능
    • 이제 Swift는 매우 작은 독립 실행형 바이너리를 생성할 수 있기 때문

  • 독립 실행형 바이너리를 생성할 수 있는 원리
    • any타입 기능을 disable되게 설정이 가능
    • full generics specialization과 static linking을 통해 적합한 바이너리 생성이 가능
    • Embedded Swift는 완전한 Swift 느낌을 주고 있음 (관용적이며 Swift코드를 계속해서 작성할 수 있게 해줌)

ex) Embedded Swift를 활용하여 Swift만으로 콘설에서도 게임이 되도록 구현이 가능

  • C, C++이 아닌 Embedded Swift를 활용하여 만들었는데도 아래 게임이 몇 kbyte로 만들기가 가능

Swift 언어 업데이트 - 3) C++ interoperability

  • 기존에도 C++ 표준 라이브러리를 Swift로 직접 가져올 수 있었음

ex) C++과 맵핑되는 Swift 코드

  • 하지만 기존에 Swift안에 있는 C++ 코드는 보안과 생산성에 관한 부분이 결여되어 있었음
    • 이제는 보안과 생산성이 개선됨

Swift 언어 업데이트 - 4) Typed throws

  • 기존에 타입에 관한 예외 처리를 위해서는 아래처럼 error를 IntegerParseError로 캐스팅하여 핸들링했었음

  • 해당 세션에 의하면, 런타임 시점에 assign되지 않은 예외같은것을 처리할 때 고도로 제한된 시스템에서는 이것이 문제가 발생한다고함
  • Swift6에서는 이것을 극복하기 위해 Typed Throws라는 것이 도입
    • 기존 throws 키워드 오른쪽에 괄호와 타입을 명시하는것

  • 이렇게 처리하면 catch에 들어오는 에러의 타입은 무조건 IntegerParseError임을 알 수 있음
    •  기존에 사용하던 throws 키워드 하나만 사용하는 것은 사실상 throws(any Error)라고 이해할 수 있음

  • generics와 Type throws를 결합하여 사용하면 특정 오류를 추상화하여 관리도 가능

ex) map함수를 사용할 때 앞에 try를 입력하여 map안에서 특정 케이스에 관해 예외 처리가 되도록 설정

  • map을 정의하는 쪽에서는 generics에 예외로 던질 타입을 정의해놓음

Swift 언어 업데이트 - 4) Data-race safety

  • Data-race: 여러 스레드가 데이터를 공유하고 그 중 하나가 데이터를 변경하려고 할 때 발생할 수 있는 문제
    • Data-race는 concurrency 프로그래밍에서 많이 접하는 오류
  • Swift는 Concurrency에서 data-race를 막기 위해서 진화해왔음
    • (Actors, Sendable type 등등..)

  • Swift는 대표적으로 Sendable 타입을 사용하여 대부분 데이터를 격리하는 작업을 수행함
    • Swift5.10부터는 Sendable과 같은 타입을 사용하여 완전한 데이터 격리를 달성
    • Swift6부터는 마침내 기본적으로 Data-race safety를 달성함

  • Swift6부터는 모든 data-race 문제를 컴파일 타임 오류로 전환함
    • 또한 앱의 security도 강화
  • Swift6 마이그레이션도 쉽도록 모듈별로 준비가 되었을때 이를 채택할 수 있는 옵션도 제공

* 참고

- https://developer.apple.com/videos/play/wwdc2024/10136/

Comments