티스토리 뷰
WWDC 2023에서 C++과 관련해 새로운 내용이 발표되었다. 이번 글에서는 Swift와 함께 C++를 사용하는 법을 배워보자.
Mix Swift and C++ - WWDC23 - Videos - Apple Developer
Learn how you can use Swift in your C++ and Objective-C++ projects to make your code safer, faster, and easier to develop. We'll show you...
developer.apple.com
영상에서 확인할 수 있지만 크게 추가된 기능은 3가지이다.
- Objective-C 브릿지 레이어 없이 C++ 코드 사용하기
- C++ 코드에서 Swift 코드 사용하기
- Swift에서 C++ 라이브러리 사용하기
기존에 Swift에서 C++ 코드를 사용하려면 직접 사용하지 못하고 Objective-C 브릿지 헤더를 거쳐서 사용했어야 했다.
MacOS 14.0, XCode 15.0 이상 부터는 Swift 코드에서 바로 C++ 프레임워크 코드를 사용할 수 있고, C++에서도 Swift 코드를 사용할 수 있다.
C++ 코드 사용하는 법은 간단하다. C++ 프레임워크를 추가해 주고 Project - Build Settings - Swift Compiler - Languages 에서 설정을 C/Objective-C -> C++/Objective-C++ 로 변경해주면 된다.
설정 해주고 빌드가 성공하면 Swift 모듈처럼 C++ 프레임워크를 import할 수 있다.
Jump To Definition (단축키 cmd + 마우스 좌클릭)를 통해 모듈의 정의로 들어가면, Swift 컴파일러가 C++ 코드를 Swift API로 생성해준 것을 확인할 수 있다.
Swift에서 C++ 클래스와 메소드를 사용하면 된다.
C++ 에서도 Swift코드를 사용할 수 있다. 예제에서는 Objective-C++에서 SwiftUI 코드를 호출했다.
우선 swift 헤더를 추가해준다.
Objective-C++ 버튼 코드 안에 SwiftUI의 Image Picker 코드를 작성해준다.
Swift코드를 사용하는 것처럼 C++ 코드를 손쉽게 사용할 수 있다.
Swift는 대부분의 c++ 컬렉션을 가져올 수 있다. Swift는 함수 템플릿 및 클래스 template specialization을 처리할 수 있다. 또 공유 포인터 및 유사한 사용자 정의 타입을 사용해 메모리를 관리할 수 있다.
C++에서도 구조체, 클래스, 메소드 등 Swift API를 사용할 수 있다.
값 타입 변환
앞서 본 것처럼 Swift 컴파일러가 C++ 코드를 Swift API로 자동 변환해준다. 이 때 스마트 포인터와 같은 C++ 코드를 안전한 Swift 코드로 바꿔줄 필요가 있다.
여기서 안전 = 값 타입이다.
스마트 포인터는 Swift에서 클래스를 생각하면 된다. Swift는 ARC를 통해 자동으로 클래스(참조 타입)를 메모리 해제해준다.
Swift는 값 타입과 참조 타입을 가진다. 그에 반해 C++는 값 타입만을 가진다.
영상에서는 라이프 타임 이슈, 참조 불가능한 메모리 접근과 같은 참조 타입의 단점들이 나온다. 이를 방지하기 위해 C++ -> Swift 변환시 기본적으로 값 타입으로 변환을 해준다고 설명한다.
C++ 타입은 위 사진과 같이 Swift 타입으로 변환된다. C++ 벡터(vector)를 예시로 들자
Swift는 벡터를 구조체로 가져온다. (값 타입으로) 벡터로 가져온 구조체와 Swift 다른 구조체가 다른 점은, Swift 구조체는 라이프 사이클을 관리하기 위한 copy constructor/ destructor 를 사용한다는 것이다. -> Swift 구조체는 copy-on-write를 한다.
벡터 구조체의 경우 constructor는 주로 깊은 복사를 한다. copy-on-write를 하는 배열과 다르게, 복사하면 모든 엘리먼트가 다 복사된다.
그렇다면 무조건 C++ 클래스를 값 타입으로만 사용해야하는 걸까??
물론 아니다! Swift의 어트리뷰트(Attribute)를 사용해 간편하게 참조 타입으로 바꿔줄 수 있다.
SWIFT_SHARED_REFERENCE(retain, release) 어트리뷰트를 사용해 강제로 Swift의 포인터/레퍼런스 타입으로 바꾼다. → unsafePointer를 간접적으로 없앤다.
ARC를 위해 Swift 코드에 reatin함수와 release 함수를 제공해야 한다.
코드에서 구조체에 SWIFT_SHARED_REFERENCE(retain, release) 어트리뷰트를 사용했다. CxxRefrenceType을 클래스처럼 사용할 수 있다.
C++의 get, set 메소드도 Swift_COMPUTED_PROPERTY 어트리뷰트를 사용하면 Swift의 get set 프로퍼티로 사용이 가능하다.
기존의 샘플 코드를 보자. getImages() 메소드를 사용하고 있다. 이는 Swift스럽지 않다.
C++에서 Swift로 변환된 코드에 Swift_COMPUTED_PROPERTY 어트리뷰트를 사용해준다.
get 메소드가 아닌 images 프로퍼티를 통해 접근할 수 있다.
이제 Swift스러워졌다.
정리
이번 기능 추가를 통해 C++ 코드를 더 쉽게 사용할 수 있게 되었다. Swift보다 더 많은 사람들이 사용하는 코드인만큼 더 많은 기능을 추가할 수 있을 것이다.
WWDC2023에 나온 프로젝트를 다운받아 실행해보려고 XCode 15.0을 설치했는데 macOS 14.0 이상부터 실행이 가능하다. 지금(23년 6월) 베타로 업데이트하는 건 도박이라 정식 버전이 나오면 실행해봐야겠다.
모바일 게임의 경우 C++ 코드를 래핑해야 하는데 Objective-C 없이 사용함으로써 개발 효율을 상당히 늘어날 것 같다. 이번 WWDC2023에 나온 게임 포팅 툴킷부터 해서 게임에 조금 더 힘을 실어주는 느낌이다.
끝끝끝끝끝끝
출처
Mix Swift and C++ - WWDC23 - Videos - Apple Developer
Learn how you can use Swift in your C++ and Objective-C++ projects to make your code safer, faster, and easier to develop. We'll show you...
developer.apple.com
Swift.org
Swift is a general-purpose programming language built using a modern approach to safety, performance, and software design patterns.
www.swift.org
apple 공식 Github에서 C++ <-> Swift 호환 여부를 확인할 수 있다.
GitHub - apple/swift: The Swift Programming Language
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
github.com
'컨퍼런스 > WWDC' 카테고리의 다른 글
[WWDC 2022] 앱 배터리 수명 개선 (0) | 2023.06.30 |
---|---|
[WWDC 2023] TipKit 사용하기 (0) | 2023.06.29 |
[WWDC 2023] SF Symbols 5에 애니메이션 적용하기 (with 예제 코드) (0) | 2023.06.22 |
[WWDC 2022] 개발자를 위한 새로운 기능 확인하기 - 각 기능 별 간단 요약 (1) | 2022.06.07 |
- Total
- Today
- Yesterday
- Combine
- 앱개발
- SwiftUI
- Swift 디자인 패턴
- Swift DocC
- UX
- 개발
- 코딩 테스트
- 디자인 패턴
- todo앱
- vapor
- swiftUI 기초
- 애플
- ios
- 부스트캠프
- 코딩테스트
- 부스트캠프7기
- 필독서
- Swift공식문서
- 책후기
- Swift문법
- Swift 서버
- Swift
- 프로그래머스
- 날씨어플
- 책
- 코딩
- 책리뷰
- TODO
- 부스트캠프iOS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |