Swift 6.4에서 확장되는 Embedded Swift 기능
Embedded Swift Improvements Coming in Swift 6.4
핵심 요약
- Swift 6.4의 Embedded Swift는 모든 `any` 타입과 메타타입을 지원해 기존 Swift 코드에서 사용할 수 있는 언어 기능의 범위를 넓힌다.
- 비형식 `throws`와 throwing task·task group을 사용할 수 있지만, `any Error`를 던지는 경우 힙 할당이 발생할 수 있어 할당을 피하려면 typed throws를 선호해야 한다.
- 부동소수점 문자열 파싱 API도 지원 대상에 포함되며, 새 기능은 Swift 개발 스냅샷과 Embedded Swift 예제 저장소에서 시험할 수 있다.
도입
Embedded Swift는 마이크로컨트롤러 같은 자원이 제한된 환경을 위해 작은 바이너리를 만드는 Swift 언어 부분집합이다. Swift 6.4에서는 기존 Swift 코드와의 호환성을 넓히도록 `any` 타입, 메타타입, 비형식 `throws`와 동시성 라이브러리 기능 등이 추가된다. 일부 동적 기능은 사용한 코드에서만 런타임 성능이나 바이너리 크기에 영향을 준다.
상세 요약
Swift 6.4에서 넓어지는 언어 지원
Embedded Swift는 자원이 제한된 환경에서 실행할 수 있도록 작은 바이너리를 만드는 Swift 부분집합이다. 정규 Swift의 언어 기능 대부분은 같은 방식으로 동작하며, Swift 6.4에서는 기존 코드와의 호환성을 높이는 기능이 추가된다. 동적 기능은 간접 호출에 따른 런타임 비용이나 메타데이터에 따른 코드 크기 증가를 가져올 수 있다. 이 영향은 해당 기능을 실제로 사용하는 코드에서만 발생한다. 크기와 성능에 민감한 코드는 PerformanceHints 진단 그룹의 경고를 활성화해 관련 사용을 점검할 수 있다.
any 타입과 제네릭 제약
기존 Embedded Swift는 AnyObject 제약이 있는 existential 타입만 지원했다. Swift 6.4부터는 Any를 포함해 모든 any 타입을 사용할 수 있다. 예를 들어 Int가 프로토콜 P를 따를 때, let a: any P = 17처럼 값을 저장하고 프로토콜 메서드를 호출할 수 있다.
다만 제네릭 특수화가 필요한 컴파일 모델에는 제약이 남는다. 제네릭 함수와 타입은 최종적으로 특수화되어야 하므로, 제네릭 함수는 any 타입 값으로 호출할 수 없다. 예를 들어 any P인 값 a를 genericMethod<T: P>(_:)에 전달하면 컴파일 오류가 발생한다.
오류 처리와 메타타입
Embedded Swift는 이전에 throws(ParsingError)처럼 구체적인 오류 타입을 지정하는 typed throws만 허용했다. 이제 어떤 Error 준수 인스턴스든 던질 수 있는 비형식 throws도 지원한다. 비형식 throws는 any Error 값을 던지는 것과 같으며, 이 과정에서 일반적으로 힙 할당이 필요하다. 힙 할당을 피하려는 코드베이스에는 typed throws가 여전히 적합하다.
메타타입 지원도 확장된다. 이전에는 Value.self를 제네릭 함수의 인자 타입으로 지정하는 등 제한적인 용도로만 허용했다. 이제 Int.self 같은 메타타입 인스턴스를 만들고 사용할 수 있으며, any (DefaultInitializable.Type) 같은 existential 메타타입도 지원한다. 이를 이용하면 메타타입에 저장된 타입의 init()을 호출해 값을 생성할 수 있다.
표준 라이브러리와 동시성
Swift에서 재구현된 부동소수점 파싱 API가 Embedded Swift에서도 제공된다. 따라서 문자열을 Double 초기화에 전달하고, 변환에 성공하면 값을 사용할 수 있다.
Embedded Swift 동시성 라이브러리는 throwing operation을 지원한다. throwing task와 task group을 사용할 수 있으며, task의 value를 try await로 읽는 방식도 지원한다.
사용 방법
Swift 개발 스냅샷에서 Embedded Swift 지원을 시험할 수 있다. Swift Embedded Examples 저장소에는 여러 하드웨어에서 Embedded Swift 코드를 빌드하고 실행하는 예제 프로젝트가 포함돼 있다. Swift 6.4의 다른 변경 사항은 Swift 6.4 출시: Swift Build 기본 적용과 상호운용성·메모리 안전성 개선에서 확인할 수 있다.
결론
Swift 6.4의 추가 기능은 Embedded Swift에서 사용할 수 있는 코드 형태를 넓히지만, 동적 기능의 비용과 제약은 남는다. 특히 비형식 `throws`는 `any Error`를 던질 때 힙 할당이 필요할 수 있고, 제네릭 함수는 `any` 타입 값으로 호출할 수 없다. 새 기능은 개발 스냅샷과 Embedded Swift 예제 프로젝트로 확인할 수 있다.