티스토리 뷰

Apple/WWDC 2021

[WWDC 2021] What's new in Swift

Dev_Pingu 2021. 9. 24. 00:47
반응형

안녕하세요 Pingu입니다.🐧

 

오늘은 WWDC 2021의 "What's new in Swift"라는 영상을 정리한 글을 써보려고 합니다. 영상 제목에서도 알 수 있듯 Swift의 새로운 기능들을 간단하게 알려주는? 영상이었습니다. 그래서 새로운 기능들은 세부적인 영상으로 공부를 또 해야 할 듯합니다. 🥲

 

What's new in Swift

Swift 5.5에서 추가된 내용은 아래와 같다고합니다.

  • Diversity
  • Update on Swift Packages
  • Update on Swift on server
  • Developer experience improvements
  • Ergonomic improvements
  • Asynchronous and concurrent programming

위 순서대로 알아보도록 한답니다.

Diversity

Diversity 파트에는 특별한 건 나오지 않았습니다.

swift.org/diversity

 

Swift.org

Swift is a general-purpose programming language built using a modern approach to safety, performance, and software design patterns.

swift.org

Swift 개발자 커뮤니티가 생겼으니 홍보하는 내용과 Swift 멘토링 프로그램이 생겼으니 위 사이트에서 활용해보라는 내용 정도였어요.

 

Update on Swift packages

Swift Package Index

Swift package는 점점 자주 사용하게 되는 것 같은데, 이번에 Swift 커뮤니티 사용자들은 Swift package를 찾는데 도움이 되는 솔루션이 생겼다고 합니다.

Swift Package Index는 Swift Package Manager가 지원하는 패키지를 찾는데 도움이 되는 커뮤니티에서 만든 페이지라고 합니다.

 

이걸 활용해서 Swift 5.5, Xcode 13의 기능으로 패키지를 쉽게 찾고 접근할 수 있는 방법을 제공한다고 해요.

필요한 패키지를 찾는데 도움이 될 것 같긴 합니다.😮

 

Swift Package Collections

선별된 Swift package 목록을 제공하는 Swift Package Collections를 제공한다고 합니다. 이걸 사용하면 더 이상 인터넷에서 패키지를 검색하거나 URL을 복사 붙여 넣기로 추가할 필요가 없다고 합니다.

 

Package Collection은 어디서나 게시할 수 있는 JSON 파일이고 선별된 패키지 목록을 제공하기 위한 기능이라고 합니다.

예를 들어 학교에서 교수님들이 필요한 패키지 세트를 만들거나, 특정 도메인이나 작업, 혹은 조직에 사용할 패키지 컬렉션을 만들 수 있다고 합니다. 이에 대한 자세한 내용은 아래 영상을 참고하라고 합니다.

그다음엔 Xcode에서 실제로 Package Collection을 사용하는 영상을 소개하는데.. 엄청 편해 보였습니다. 필요한 패키지를 알아서 다운받아서 import 해주는데 위에 나온 사례들에서는 정말 유용하게 쓸 수 있겠다 싶었습니다.

 

그리고 검색 기능을 활용해서 필요한 패키지를 찾을 수도 있으니 확실히 잘 활용하면 좋은 기능이라는 생각이 듭니다.

 

New Swift Packages

올해 기존에 존재하던 Swift 패키지들 외에도 위에서 표시된 4개의 새로운 패키지를 출시했다고 합니다.

  • Swift Algorithms
  • Swift Atomics
  • Swift Collections
  • Swift System

근데 언급하는 건 위 4개가 아닌 아래 5개입니다.

  • Swift Collections
  • Swift Algorithms
  • Swift System
  • Swift Numerics
  • Swift Argument Parser

이름만 봐도 코딩 테스트할 때 유용할 녀석들도 보이네요.. 실제로 테스트에서 사용 가능할진 모르지만..

 

Swift Collections Package

먼저 새로 생긴 Swift Collection은 Swift에서 사용할 수 있는 자료구조를 확장해주는 패키지인데, 패키지를 사용하면 위의 세 자료구조가 새롭게 사용 가능하다고 합니다. 이 정도는 언어 자체에 추가를 해주는 게..🥲 직접 Deque를 만들어서 사용한 기억과 OrderedSet은  Core Data를 사용해보며 이미 사용한 경험이 있는 거 같은데? 뭔가 이상하네요.

 

어쨌든 이렇게 3개의 자료구조를 패키지를 사용하면 사용하게 해 준다고 자랑하며 사용법도 알려줍니다. 😆

Swift Algorithms Package

다음으로는 Swift Algorithm 패키지를 자랑합니다. 이건 Sequence, Collection 알고리즘의 새로운 오픈소스입니다.

 

위에 존재하는 모든 알고리즘을 제공한다고 합니다. 그중 감동?적인 부분은 순열 조합을 만드는 기능을 제공한다는 점이었습니다. 코딩 테스트에서 자주 활용되는 알고리즘인데.. 매번 구현하느라 슬펐던 기억이 있네요.🥲 이에 대한 더 자세한 내용은 아래 영상을 참고하면 된다고 합니다.

Swift System Package

다음은 Swift System입니다. 작년 가을에 발표했다고 하는 이 패키지는 system call의 저수준 인터페이스를 제공하는 패키지라고 하며 Apple, Linux, Window에서 사용할 수 있다고 합니다.

 

추가된 기능은 각 OS 별로 파일 경로를 잘 제공하는 기능이라고 합니다.

Swift Numerics Package

다음은 Swift Numerics입니다. 작년에 iOS, tvOS, watchOS에 Float16이 추가되었다고 하네요. 오.. 없는 거도 몰랐던 1인입니다. 어쨌든 그랬었는데, 올해는 Apple Silicon macs에도 Float 16, Flaot 16 복소수를 사용할 수 있게 되었다고 합니다. 또 로그, 사인, 코사인과 같은 모든 기능에 대한 복소수를 지원한다고 합니다. 이를 Swift로 작성해서 더 잘 사용할 수 있다고 합니다.

Swift ArgumentParser Packages

마지막으로 Swift ArgumentParser입니다. 원래 존재했던 패키지를 계속 개선해서 Fish Shell용 스크립트 생성 기능, 짧은 옵션 결합 기능, 오류 메시지 개선 기능이 추가되었다고 합니다.

Update on Swift on server

다음 섹션으로 서버 개발에서 Swift를 지원하기 위해 진행된 작업들을 소개한다고 합니다. 작년에 Amazon linux를 포함한 여러 플랫폼에 대한 지원을 추가했다는데, 올해도 Swift 서버 앱의 성능과 기능 향상을 위해 작업을 했다고 합니다.

 

향상된 내용은 위와 같이 3개라고 합니다. Linux에서 정적 링크를 활성화해서 앱 시작 시간을 단축하고 단일 파일로 배포할 수 있는 서버 앱 배포를 간소화했다고 합니다. 또한 Swift 5.5에서는 Linux에서 사용되는 JSON 인코딩 디코딩이 처음부터 다시 구현돼서 성능이 향상되었다고 합니다. 마지막으로 AWS Lambda 런타임 라이브러리 자체의 성능을 개선하고 최적화했다고 하네요.

 

그래서 위와 같이 빨라졌다고 합니다.👍

Developer experience improvements

DocC

Swift 개발자 경험을 개선하기 위해 개발 문서 부분을 개선했다고 합니다.

 

Xcode 13 내부에 통합된 문서 컴파일러인 DocC가 추가되었다고 합니다. 이걸 사용해서 좋은 문서를 작성하고 공유하는 게 편리해졌다고 해요. DocC는 마크다운 주석과 같이 이미 알고 있는 도구와 기술을 사용하여 문서를 쉽게 작성할 수 있도록 도와준다고 합니다. 한 번쯤 사용해보고 싶은 기능이네요!

DocC에 대한 자세한 내용은 아래의 4개 영상을 참고하라고 합니다.

 

그리고 DocC가 올해 말에 오픈 소스가 될 것이라고 합니다. 그래서 Swift 지원 플랫폼에서는 좋은 문서를 쉽게 생성할 수 있을 거라고 하네요!

 

Swift Type Checker

Swift 5.5에서는 type checker의 품질 및 성능 개선이 되었다고 합니다. 그 결과 코드를 컴파일할 때 자주 보던 "expression too complex" 오류가 더 적게 표시된다고 해요. 또한 array literal의 type check 성능도 좋아졌다고 합니다.

 

그래서 위의 사진과 같이 기존에는 오류를 발생하던 부분도 모두 정상적으로 작동한다고 합니다.

 

Build Improvements

이번 릴리즈에서는 개발자 생산성을 향상시키기 위해 빌드 속도를 개선하는 작업을 했다고 합니다.

 

  • incremental import를 제공합니다
    • 해당 모듈이 변경될 때 모듈을 import 하는 모든 소스 파일을 더 이상 빌드하지 않는다고 합니다
  • module dependency graph를 미리 계산합니다
    • 변경된 항목만 incremental build를 빠르게 시작한다고 합니다
  • extension과 함께 작동하도록 selective recompilation을 확장합니다
    • extension을 사용했을 때 더 적은 수의 재컴파일을 의미한다고 합니다

SwiftDriver라는 오픈 소스 프로젝트를 예로 들면, 아래와 같이 빌드 시간이 개선되었다고 합니다.

 

Memory Management

마지막으로 Swift에서 메모리 관리를 보다 효율적으로 개선했다고 합니다.

 

Swift 클래스 인스턴스는 ARC를 사용해서 객체의 참조수를 추적하게 됩니다. 이렇게 Swift가 알아서 메모리를 관리해주는데, 이번에 참조 유지, 해제 작업 수를 크게 줄일 수 있도록 컴파일러 내부에서 참조를 추적하는 새로운 방법을 도입했다고 합니다. 이를 통해 성능 향상과 코드 크기를 줄였다고 하네요.

 

이러한 새로운 기능이 코드에 미치는 영향을 확인할 수 있는 Xcode 설정인 Optimize Object Lifetimes를 추가했다고 합니다. 이에 대한 좀 더 자세한 내용은 아래 영상을 참고하라고 합니다.

Ergonomic improvements

이번 섹션에서는 Swift의 여러 개선사항에 대해 알아봅니다.

 

위 사진에 언급된 내용들이 변경된 내용들이라고 합니다. SE 번호는 Swift Evolution Proposals를 식별합니다. 각각의 Proposals는 Swift 커뮤니티에서 논의되어 결정된 내용이라고 하네요. 이번 영상에서는 이들 중 몇 가지를 살펴본다고 합니다.

Result Builders

첫 번째로 Result Builder입니다. SwiftUI가 처음 발표되었을 때 복잡한 객체 계층을 빠르고 쉽게 설명할 수 있는 새로운 문법을 도입했었는데, 이러한 문법은 Swift Evolution 프로세스를 통해 표준화되어 다양한 곳에서 더 쉽게 사용할 수 있다고 합니다. 이 기술을 자세히 알고 싶다면 아래 영상을 보라고 합니다.

Enum Codable synthesis

Codable 프로토콜은 데이터를 직렬 화하는 편리한 방법이지만, 오랫동안 생략된 부분이 존재해서 사용에 어려움이 있었다고 합니다. 😮

 

2 case를 갖는 Enum의 경우 Codable을 준수하도록 하려면 위처럼 코딩을 했어야 했는데, 이제 Codable 프로토콜만 채택해주면 컴파일러가 알아서 해준다고 합니다.

Flexible static member lookup

Swift type checker에 개선사항이 있다고 합니다. Swift의 타입 추론은 중복된 타입 정보를 생략할 수 있음을 의미하는데요, 예를 들어 아래 코드를 보겠습니다.

 

Coffee Enum에서 regular, decaf를 선언했는데 Coffee.regular로 써도 되지만, .regular로 줄일 수도 있습니다. 하지만 Structure도 다르게 표현될 수 있다고 합니다.

 

예를 들어 위와 같이 Coffee 프로토콜을 준수하는 RegularCoffee, Cappuccino 구조체가 있고 API에서 해당 타입의 인스턴스를 사용하려고 할 때 위와 같이 사용할 수 있다고 합니다. 이제 이렇게 Enum과 유사하게 사용할 수 있다고 하네요.

Property wrappers on parameters

Property wrapper도 개선되었다고 합니다. Property wrapper는 property에 일반적인 의미를 부여하기 위한 편리한 도구로 구조체에 @propertyWrapper 키워드로 고유한 Property Wrapper를 구현했습니다.

 

위와 같이 empty면 안된다는 요구 사항을 추가하는 예를 보도록 하겠습니다. 지금까지는 위와 같이 프로퍼티에 사용했었는데 이제부터는 property wrapper를 함수 및 클로저 매개변수로 사용할 수도 있습니다.

 

이렇게만 보면 와닿지 않았는데, 다행히 영상에서 자세한 예를 보여줍니다. SwiftUI 코드로 만든 예를 보도록 할게요.

 

위 예제는 Setting 타입의 배열과 Setting 타입의 값 옆에 토글이 있는 설정 목록을 보여주는 SwiftUI View입니다. 여기서 이번에 Swift 5.5에 추가된 기능으로 코드를 단순화해본다고 합니다.

 

1. Toggle() 생성자는 중복된 코드이므로 #if문과 toggleStyle과 같은 postfix 코드를 아래와 같이 수정할 수 있습니다.

 

2. 그리고 아까 언급됐던 type checker 개선사항을 SwiftUI에서도 사용할 수 있는데, 이를 활용한 점 표기법으로 아래와 같이 코드를 줄일 수 있습니다.

 

3. List와 해당 리스트의 클로저에서 배열을 인덱싱 하는 게 이상하므로 아래와 같이 수정하여 생성자에 배열의 값들을 직접 전달할 수 있으면 좋을 거 같은데. Property wrapper에 대한 새로운 기능을 통해 이를 가능하게 합니다.

클로저의 인수를 $ 기호로 작성할 수 있는데, 이렇게 하면 아래와 같이 클로저에 하나의 값이 제공됩니다.

 

4. Swift 컴파일러는 CGFloat과 Double을 알아서 잘 변환해줘서 아래와 같이 코드를 수정할 수 있습니다.

 

이번 예제 말고도 SwiftUI 프로그래밍에 개선된 여러 변화는 아래 영상을 참고하면 된다고 하네요.

Asynchronous and concurrent programming

제가 가장 궁금했던 내용입니다. Swift 5.5부터는 드디어 async, await가 도입되면서 비동기, 동시 프로그래밍을 쉽게 작성할 수 있게 되었습니다. 아주 친절하게도 영상에서는 Asynchronous(비동기), Concurrent(동시)부터 알려준다고 합니다.

 

일반적으로 프로그램은 위와 같이 진행됩니다.

 

위와 같이 진행되는 프로그램을 Asynchronous(비동기)라고 합니다. 비동기 작업의 예로는 네트워킹 작업이 있는데요, 어떤 데이터를 다운 받는 작업은 비교적 길 수 있는데, 완전히 받을 때까지 기다렸다가 다음 작업을 시작해야 합니다. 즉 다운받는 동안에 다른 작업을 실행하지는 않아요.

 

반대로 Concurrent 작업은 두 개 이상의 코드를 동시에 실행할 수 있습니다. 아까와 동일하게 데이터를 다운 받는다고 해도, 다운받는 동안 다른 작업도 실행할 수 있는 거죠.

 

 

위의 코드가 Swift 5.5 이전의 비동기 코드입니다. 네트워크 호출을 위해 URLSession을 사용하고 dataTask 메서드로 비동기 작업을 수행합니다. 완료되면 클로저를 실행하게 되죠. 이렇게 작성된 코드는 실행 순서와 코드 순서가 달라서 조금 어색하게 보였어요. 그리고 이렇게 completion handler를 사용하면 try / catch를 사용한 오류 처리도 사용할 수 없습니다.

 

이걸 이제 Swift 5.5에 추가된 기능으로 만들어보겠습니다.

 

먼저 위와 같이 기존 코드를 수정해줍니다. 해당 작업으로 우리는 데이터를 얻고 싶은 건데, HTTP 통신이니 Response도 알아야 합니다. 따라서 위와 같이 튜플로 가지고 옵니다.

 

그런 뒤 위와 같이 수정하면 try / catch 문을 활용한 오류 처리도 가능하게 됩니다.

 

이제 기존 작업과 동일하게 동작하도록 만들기 위해서 data 메서드가 시작되면 해당 작업이 완료될 때까지 다른 작업이 진행되지 않도록 해야 하는데, 이 때는 위와 같이 await 키워드만 써주면 됩니다.

 

결과적으로는 아까와 동일한 작업을 Swift 5.5에서는 아래 코드로 대체할 수 있습니다.

 

아까 보다 코드가 순차적으로 진행되기 때문에 코드를 해석하는 게 훨씬 쉬워 보입니다. await 키워드는 fetchImage() 함수가 일시 중단될 수 있는 지점을 나타내고, 다시 진행할 수 있는 이벤트가 발생할 때까지 기다립니다. 위 코드의 경우 네트워크 요청이 실해하면 Error를 던지고 그렇지 않으면 image를 반환하게 됩니다. 그리고 이 과정에서 스레드를 차단하지 않기 때문에 다른 작업을 실행할 수 있습니다.

 

이번 글에서 async가 갑자기 함수 선언부에 생기긴 했는데 async / await 키워드는 throw, try 구문과 비슷하게 쓰인다고 보면 된다고 합니다.

 

좀 더 자세히 async / await에 대해 알고 싶다면 아래 영상을 보라고 하니 꼭 봐야겠네요.

그럼 비동기 작업은 어떻게 하는지 알아봤으니 다음은 async / await를 사용하는 Swift의 새로운 동시성 지원에 대해 알아보도록 하겠습니다.

 

위 함수는 3개의 다른 이미지를 렌더링 한 뒤 merge 하는 함수입니다. 위와 같이 순차적으로 진행되는 코드죠. 이렇게 진행되면 background, foreground, title이 순차적으로 그려지게 되는데, 그거보다는 3개의 이미지가 동시에 그려지는 게 좀 더 좋겠죠?

 

이렇게 그려지더라도 3개의 렌더링 작업이 완료될 때까지 merge 작업은 실행되면 안 됩니다. 따라서 아래와 같이 코드를 수정해줘야 합니다.

 

함수 선언부에 async 키워드를 작성하고 지역변수들인 background, foreground를 async let으로 선언하면 해당 값들이 준비될 때까지 merge 작업을 기다립니다. 이를 나타내기 위해서 merge 앞에 await 키워드도 작성해주면 됩니다. 그리고 둘 중 하나의 작업이라도 완료되지 않았다면 함수가 반환되지 않기 때문에 혹시라도 오류가 있으면 반환하기 위한 throws, try 오류처리도 해줍니다.

 

이 부분에 대한 좀 더 자세한 내용은 아래 영상을 참고하면 된다고 합니다.

 

Actor

이렇게 Swift 5.5에서 여러 스레드에서 작업을 쉽게 실행하는지 봤는데요, 멀티 스레드 환경에서 자주 발생하는 문제 중 하나인 공유자원을 처리하는 문제는 async, await 만으로 해결할 수 없습니다. 이를 해결하기 위해서는 Swift의 새로운 Actor를 사용해야 합니다. 이번에도 예를 볼게요!

위 코드는 통계를 수집하는 클래스입니다. 클래스는 참조 타입이므로 힙 공간에 존재해서 여러 개의 스레드가 공유 자원으로 사용하게 됩니다. 이 클래스에는 counter가 있고 increment 메서드로 counter의 값을 1씩 증가시킬 수 있죠. 근데 이 코드는 멀티 스레드에서는 잘 작동하지 않습니다. 공유자원에 대한 보호가 없다면 말이죠.

 

이를 위해서 Class 대신 Swift Actor를 사용하게 됩니다. Actor는 이상한 데이터를 만들 수 있는 작업이 안전해질 때까지 작업을 일시 중단하며 작동합니다. 따라서 Actor 외부에서 Actor 메서드를 호출할 때 await를 사용해야 합니다.

 

Actor는 위와 같이 async / await에서도 잘 작동하는데, 위와 같이 publish() 메서드를 async로 선언하면 네트워크 작업을 수행하는 동안 해당 메서드가 멈추게 됩니다. 일시 중지되는 동안에는 네트워크 작업이 완료될 때까지 기다리지 않고 데이터 손상 위험 없이 Actor의 다른 메서드를 실행할 수 있습니다.

 

이러한 Actor는 Class와 같은 참조 타입이지만 멀티 스레드 환경에서 안전하게 사용할 수 있도록 해줍니다. 즉 Actor로 선언한 데이터는 여러 스레드가 동시에 접근할 수 있음을 명시하는 것이고, 런타임 접근을 제한하여 데이터가 스레드로부터 안전하도록 하는 것입니다!

 

Actor에 대한 자세한 내용은 아래 영상을 참고하라고 합니다. 재밌어 보이니 이거도 나중에 봐야겠어요.

뭐 이후 영상에서는 Swift 6을 개선하기 위해서는 사용자의 경험이 중요하다면서 커뮤니티에 많은 활동을 부탁한다 정도의 내용이라 따로 정리하지는 않겠습니다.

 

확실히 Swift 5.5는 비동기, 동시성 프로그래밍 작업 시 많은 도움이 될 것 같습니다. 게다가 성능도 좋아졌다고 하니 아주 기대가 됩니다.😄 이번 영상은 Swift 5.5의 변경사항들을 간단하게 보는 영상이라 자세한 건 언급된 영상들을 봐야지 자세히 알 수 있을 거 같네요.

 

그럼 오늘 WWDC 영상인 "What's new in Swift"는 여기까지 정리하도록 하겠습니다.

 

감사합니다.😄

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함