THIS IS ELLIE

WWDC2020 What's New in Swift 본문

공부/WWDC

WWDC2020 What's New in Swift

Ellie Kim 2020. 6. 30. 23:46

What’s New in Swift

오늘날 여러방면으로 스위프트 주변이 활성화 되고있다. 

 

차례  

  • 애플 OS와 API에서의 스위프트
  • 오픈소스 라이브러리 
  • 크로스 플랫폼

 

스위프트5의 ABI 안정성으로 바이너리 프레임워크가 더욱 빨라졌다.

이는 강력한 새로운 API를 출현하도록 이끌었다.

결국 스위프트는 크로스 플랫폼 언어로 도달했다.

 

스위프트 런타임 퍼포먼스

코드 사이즈

코드 사이즈는 앱의 일부이고 앱의 로직에서 기계어를 나타낸다.

코드 사이즈는 지금까지 최적화에 집중해서 여러번에 걸쳐 출시했다.

 

그 과정을 추적해보자 

(줄어드는 바이너리 사이즈)

스위프트와 오브젝티브씨 버전을 비교했을 때, 

스위프트4 에서는 코드 사이즈가 오브젝티브씨의 2.3배였다. 

스위프트4.1에서 코드 사이즈 최적화 설정으로 큰 덩어리를 걸러냈다. 

현재도 차이를 좁혀나가고 있으며, 스위프트5.3에서 1.5배로 줄였다. 

 

그럼 SwiftUI에서는 어떨까 SwiftUI도 코드 사이즈가 줄었다. 

위는 Thomas Ricouard가 만든 유명한 오프소스 앱MovieSwiftUI를 비교한 것이다.

이 앱의 코드 사이즈가 40% 이상 줄었음을 확인할 수 있다.

바이너리 사이즈는 다운로드 시간에 필수적이다. (영향을 끼침)

 

메모리

스위프트는 값 타입을 사용하기 때문에 참조 타입을 기반으로 하는 언어에 비해 가지는 기본적인 장점들이 존재한다.

왜그런지 예를 들어보겠다.

오브젝티브씨의 간단한 모델 타입이다.

UUID, String, Number을 가진다.

 

이 모델이 메모리에서 어떻게 되는지보자.

우리가 배열을 생성했을 때 오브젝티브씨에서 객체 변수는 그냥 포인터들이다.

배열은 모델 객체의 포인터를 가진다.

객체들은 차례로 그들의 프로퍼티를 가진다.

할당하는 모든 객체는 성능과 메모리 사용에서 조금의 오버헤드를 갖는다. 

오브젝티브씨에서는 특별하게 (ASCII 문자열들 나타내는) 문자열을 가진다.

그리고 그것을 포인터 내에 저장한다. 

이는 여분의 객체 할당하는 것을 절약할 수 있다. 

 

동일한 모델을 스위프트로 보겠다.

스위프트는 값 타입을 사용하기 때문에 포인터를 사용해 위 값들에 접근할 필요가 없다.

그래서 UUID들은 Mountain 객체 내에서 갖는다.

그리고 스위프트의 작은 문자열은 많은 문자를 갖는다. (NON-ASCII 문자를 포함해 최대 5개의 코드 유닛)

결과적으로 모든 Mountain 객체들은 배열 저장소 내에 직접 할당될 수 있다.

모든것이 연속적인 메모리 블럭내에 존재한다.

스위프트 프로그램은 값 타입을 사용함으로써 상당한 메모리 이점을 얻는다.

 

힙 메모리 사용량을 살펴보자.

스위프트가 훨씬 컴팩트하다.

스위프는 값 타입을 사용하여 오브젝티브씨보다 더 적은 힙 메모리를 사용한다.

 

이러한 이점에도 불구하고 런타임 오버헤드 때문에 이전의 스위프트 버전에서 더 많은 힙 메모리를 사용했었다. 

이전에 스위프트는 많은 캐시와 메모리를 만들어서 사용 했기 때문이다.

 

모든 언어는 어느정도의 오버헤드가 발생하지만, 

스위프트는 다른 언어들에 비해서 상당한 오버헤드가 발생했다. 

그리고 이를 최적화하는 것에 포커스를 맞췄다.

기쁘게 스위프트5.3에서 많은 오버헤드를 줄였다. 

(이렇게 될려면 iOS14으로 설정해야 함, 이전에 배포된 OS에서도 어느정도 반영함)

  

- 저사양 OS 서비스에 메모리 사용량은 중요하다.

- 스위프트 스탠다드 라이브러리 위치를 Foundation아래에 위치하게 변경했다.

(오브젝티브씨나 씨를 사용해서 개발해야 했던 프레임워크를 개발할 수 있다.)

 

진단

 

컴파일러로 부터의 경고나 에러들이 개선되었다.

문제가 발생한 부분을 정확하게 가르킬 수 있도록 해결했다.

이것은 이해할 수 없는 에러의 예시다.

이것이 변경된 에러의 예시다.

정확하게 어떤 것이 에러인지 훨신 더 명확하게 말해준다.

 

코드 완성

 

타입 추론을 통한 코드 완성

딕셔너리에서 암시적으로 멤버 이름 제공

삼항연산자 암시적으로 이름 제공

키패스에서도 코드완성이 제공된다.

코드 완성의 성능 향상 

코드 완성은Xcode 11.5에 비해 15배 속도 개선이 되었다.

이것은 특히나 스위프트UI 코드를 작성할 때 더욱 효과적이다. 

 

코드 들여쓰기

 

들여쓰기 포맷이 개선된다.

  • 메소드 체이닝
  • 함수 호출
  • 튜플
  • 여러 줄에 걸쳐있는 Collection(배열, 집합, 딕셔너리) 요소들
  • 여러 줄의 if, guard 그리고 while 조건문

오픈소스인 MovieSwiftUI 프로젝트를 살펴보자.

https://github.com/Dimillian/MovieSwiftUI

이전까지 스위프트UI에서의 체이닝 코드를 살펴보면 이렇다.

하지만 빨간 부분이 사라지고 코드가 깔끔하고 보기좋게 정렬된다.

 

디버깅

디버깅 정보 제공

스위프트 런타임 오류가 발생할 때 실패함을 보여주는 것이 아니라 이유를 보여준다.

 

견고성이 향상된 디버깅

디버깅을 위해 모듈을 사용하는 장단점

- LLDB는 스위프트 및 Clang모듈을 사용해 타입을 분석한다.

- LLDB는 컴파일-타임과 다른 모듈 오류가 발생할 수 있다.

 

위 장단점이 왜그런지 이해해보자.

스위프트는 컴파일타임에 Objective-C와 상호 운용한다.

스위프트는 타입과 변수에 대한 정보를 가져오기 위해서 Clang모듈을 사용해 Objective-C에서 API를 가져온다.

LLDB는 모든 스위프트 및 clang모듈을 가져와야 한다. 

(이것이 현재 디버깅 컨텍스트에서 볼 수 있는 것이다.)

 

모듈 파일은 타입에 가치있는 정보를 가진다.

Clang 모듈을 가져오는 것에 실패할 때도 있다. (컴파일 타임이 아닐때)

흔하게 실패하는 경우는 다른 동적 라이브러리와 검색하면서 충돌하는 것이다.

 

[새로운] 견고성이 향상된 디버깅

스위프트에서 오브젝티브씨 타입을 위해 DWARF 디버그 정보 사용

LLDB는 이제 디버그 정보를 사용해 스위프트에서 오브젝티브씨 타입을 분석할 수 있다.

Xcode 변수 view와 같은 핵심 디버깅 기능의 안정성을 높인다.

 

LLDB는 스위프트 디버깅을 위해 DWARF디버깅 정보에서 씨와 오브젝티브씨 타입을 포함할 수 있다.

 

크로스 플랫폼

스위프트는 크로스 플랫폼에 대해서 지원한다.

 

공식적으로 스위프트는 계속 성장하기 위해 더 많은 플랫폼을 지원한다.

  • Apple platforms
  • Ubuntu 16.03, 18.04, 20.04
  • CentOS 8
  • Amazon Linux 2
  • Windows (곧 지원함 Swift5.3) 

여러 곳에서 스위프트를 사용할 수 있는 기회를 제공한다.

 

Swift AWS Lambda

클라이언트 애플리케이션 개발자를 위해 앱을 클라우드로 확장할 수 있는 쉽고 효율적으로 구현할 수 있도록 돕는다. (서버리스 기능)

오픈소스인 Swift AWS runtime를 사용해서 스위프트에서 서버리스 기능을 쉽게 구현할 수 있도록 한다.

(깃헙에 100% 오픈소스임)

Hello world를 출력하기 위한 간단한 코드의 양을 봐라. 

 

언어와 라이브러리

스위프트 언어 업데이트

스위프트5.2에서 스위프트5.3까지 많은 것들이 업데이트 되었다.

(여기서 SE는 Swift Evolution website에서 확인할 수 있는 번호다.)

 

SE-0279 다중 trailing closure구문

 

스위프트는 trailing colusre구문을 지원하고 있었다. 

이는 명확성을 잃지 않고 더 간결하고 덜 중첩될 수 있어서 많이 사용되고 있었다.

(읽기도 좋음)

 

하지만 다른 사례를 살펴보자.

trailing closure는 마지막 클로저만 제한적으로 적용된다.

이 부분은 trailing closure가 읽기 어렵게 만든다.

스위프트 가이드는 trailing closure 사용을 금지했다.

하지만 많은 사람들이 그들이 보기 좋게 만들었다. (많은 사람들이 요청)

그래서 스위프트5.3에서는 다중 trailing closure구문을 지원한다.

 

SE-0249 키패스 표현식

 

스위프트4.1에서 우리는 스마트한 키패스를 소개했다.

값을 가져오고 설정하는데 사용되는 프로퍼티의 호출되지 않은 레퍼런스를 나타내는 타입이다.

호출 부분을 간단하게 프로퍼티에 접근하길 기대한다면

 

키패스는 API를 설계할 때 함수 파라미터의 대안이될 수 있다. 

키패스는 더 간결하고 중첩되는 것을 줄일 수 있다.

이 예제는 루비의 알고리즘(chucked)을 가져온 것이다.

 

가족 신발 사이즈별로 있다고 생각해보자.

  • 7.0 victoria
  • 7.5 elizabeth
  • 8.0 meghan
  • 9.5 kyle, charles
  • 10.0 harry

charles를 시도해보자.

샌달이 .5사이즈가 나오지 않는다면, 두개의 함수 호출을 서포트하기 위해 중복으로 정의해야 한다.

스위프트5.2에서 키패스 표현식이 함수처럼 사용된다.

이 의미는 어떠한 함수 파라미터로 키패스를 전달할 수 있다는 의미이다.

(입출력이 매칭된다면) 중복된 선언들을 제거할 수 있다.

 

SE-0281 @main

@main는 프로그램의 시작점을 지정해주는 도구이다.

모든 프로그램은 시작점을 지정해야한다. 

스위프트1.0 이후에는 앱 델리게이트에 @UIApplicationMain를 사용했다.

이는 컴파일러에게 암시적으로 main.swift를 생성하도록 말한다.

스위프트 5.3에는 프로토콜이나 슈퍼클래스에 스테틱 메인 메소드를 선언하면 된다. 

 

SE-0269 클로저에서 암시적 self

순환참조가 일어날 수 있는 경우, 이스케이핑 클로저 캡쳐를 하는 경우 self를 쓰도록 한다.

하지만 너무 많이 쓰게되면 불필요하게 느낄 수 있다.

 

스위프트5.3에서는 캡쳐 리스트에서 self를 포함하고 있다면 클로저의 바디에서 생략할 수 있다.

struct enum 타입일경우 순환참조가 일어나지 않으므로 전체적으로 self를 생략할 수 있다.

SE-0276 다중-패턴 catch절

do catch구문은 switch문 만큼 표현적이지 않다.

스위프트5.3에서 변경된다.

이와 같은 패턴은 직접적으로 catch문에 접근할 수 있고 훨씬 읽기 쉽게 만들어준다.

 

enum 개선

스위프트 4.1부터 컴파일러는 equatable & hashable 합성을 지원했다.

하지만 때에 따라 비교 연산을 필요로 한다.

그래서 스위프트5.3에서 가능하도록 했다. 

fileCorrupted가 static var야? enum case야?

keyNotFound가 static func야? enum case야?

두 가지에 대해서 호출하는 방법은 동일하다.

스위프트5.3에서는 enum case를 향상시켰다.

static var과 static func를 프로토콜로 준수할 수 있다.

 

SDK

 

Float16

스위프트5.3에서 새롭게 Float16이 추가되었다.

Flaot16은 2바이트의 메모리만을 가진다.

SIMD레지스터나 페이지 메모리에 두배 더 들어갈 수 있다. (그래서 2배의 효과도 남)

하지만 데이터 타입이 작은만큼 정밀도와 범위가 더 제한된다는 것에 주의해라. 

(특히 기존에 구현된 double과 float와 Float16과의 변환 작업에서 주의해라)

 

애플 아카이브 

빠른 멀티스레드 압축에 최적화 되어 있다.

애플 아카이브를 사용하면 효율적으로 아카이브를 압축 가능하다. 

 

스위프트 시스템

시스템 호출에 관용적인 인터페이스 제공한다.

저수준 통용 타입 (ex: 애플 아카이브)

 

OSLog

고성능, 개인 정보 보호 로깅

문자열 보간 기반 API

표현 형식의 옵션

 

스위프트5.3에서 정교하게 컴파일러를 최적화했다. 

오버헤드도 최소화.

훨씬 빠르고 더 표현이 풍부해진다. 

(버그 찾기가 더 쉬워질 것)

 

스위프트 패키지 매니저

 

스위프트 뉴메릭

이는 숫자에 관련된 새로운 오픈소스 패키지이다.

스위프트 뉴메릭은 모든 기본적 수학적 함수를 정의했다.

 

Swift Argument Parser

이는 커맨드라인 argument parsing을 위한 새로운 오픈소스 패키지이다.

 

Swift Preview Package 

프리뷰 패키지는 함수에 대한 접근을 제공한다.

 

 

resource: https://developer.apple.com/videos/play/wwdc2020/10170

 

What's new in Swift - WWDC 2020 - Videos - Apple Developer

Join us for an update on Swift. Discover the latest advancements in runtime performance, along with improvements to the developer...

developer.apple.com

 

반응형

'공부 > WWDC' 카테고리의 다른 글

Apple 이벤트 2020  (0) 2020.09.23
WWDC2020 Become a Simulator Export  (0) 2020.08.12
WWDC2020 키노트 정리  (0) 2020.06.30
WWDC2019 Architecting Your App For Multiple Windows  (0) 2020.05.15
WWDC2019 LinkPresentation  (0) 2019.10.21