SwiftUI와 UIKit
iOS 앱을 개발할 때 UI를 만드는 방법은 크게 SwiftUI와 UIKit 두 가지가 있다.
SwiftUI
2019년 WWDC에서 등장한 최신 UI 프레임워크
선언형(Declarative) 방식으로 UI 작성 가능
코드만으로 UI 생성 가능
데이터 바인딩 강력함
UIKit
iOS 2.0부터 사용된 UI 프레임워크
오랫동안 iOS 개발의 표준
스토리보드와 코드로 UI 구성 가능
SwiftUI와 UIKit의 차이점
항목 | SwiftUI | UIKit |
출시 연도 | iOS 13 (2019) | iOS 2.0 (2008) |
UI 방식 | 선언형 (Declarative) | 명령형 (Imperative) |
코드 스타일 | Swift 코드 기반 | 이벤트 기반 코드 + 스토리보드 |
데이터 바인딩 | @State, @Binding, @ObservedObject 등 활용 | 수동 업데이트 |
미리보기 기능 | Xcode Canvas 실시간 미리보기 | 스토리보드(Interface Builder) |
지원 플랫폼 | iOS 13+, iPadOS 13+, macOS 10.15+, watchOS 6+, tvOS 13+ | iOS, iPadOS, macOS, watchOS, tvOS |
호환성 | iOS 13 이하에서는 사용 불가 | 기존 앱과 완벽 호환 |
SwiftUI의 장단점
장점
코드가 간결함: UI와 로직을 하나의 Swift 코드로 작성 가능
미리보기 기능: Xcode Canvas에서 실시간으로 UI를 확인 가능
다양한 플랫폼 지원: 하나의 코드로 iOS, macOS, watchOS 등 개발 가능
데이터 바인딩이 쉬움: @State, @Binding 등을 사용해 UI 업데이트가 자동화됨
애니메이션 구현이 간편함: 한 줄의 코드로 부드러운 애니메이션 적용 가능
단점
iOS 13 이상에서만 사용 가능: 구버전 지원이 필요하면 UIKit을 함께 사용해야 함
UIKit의 일부 기능이 부족함: 고급 커스터마이징이 필요할 경우 UIKit을 활용해야 함
커뮤니티와 문서가 상대적으로 적음: UIKit에 비해 자료가 부족한 경우가 있음
UIKit의 장단점
장점
오랜 기간 사용된 검증된 기술: 대부분의 앱이 UIKit 기반으로 개발됨
강력한 커스터마이징 가능: UI에 대한 완벽한 제어가 가능함
방대한 문서와 튜토리얼: 오랫동안 사용된 만큼 학습 자료가 많음
단점
코드가 복잡함: 명령형 방식으로 UI를 구성해야 하며, 코드량이 많아질 수 있음
데이터 바인딩이 어려움: SwiftUI에 비해 상태 관리를 직접 처리해야 함
미리보기 기능이 부족함: Xcode에서 UI 미리보기를 보려면 실행해야 함
그래서 어떤걸 공부해야할까?
나처럼 이제 막 iOS 개발을 시작한 초보자라면, SwiftUI를 공부하는 것이 좋다고 생각한다.
왜냐하면,
Swift 코드만으로 UI를 만들 수 있기 때문에 배우기 쉬움
최신 트렌드. 게다가 Apple도 SwiftUI를 적극 지원함
선언형 UI 패턴이 React, Jetpack Compose 같은 최신 UI 개발 방식과 유사함
하지만, UIKit도 알아두는 것이 좋다
기존 앱 대부분이 UIKit으로 개발됨
SwiftUI에서는 지원하지 않는 기능이 많아 UIKit과 함께 사용해야 할 때가 있음
SwiftUI와 UIKit 함께 사용하기
대표적으로 UIViewControllerRepresentable과 UIHostingController를 활용하는 것
import SwiftUI
import UIKit
struct UIKitView: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> UIViewController {
return MyUIKitViewController()
}
func updateUIViewController(_ uiViewController: UIViewController, context: Context) {}
}
UIKit 프로젝트에서 SwiftUI 뷰를 사용할 수도 있다
let swiftUIView = MySwiftUIView()
let hostingController = UIHostingController(rootView: swiftUIView)
navigationController.pushViewController(hostingController, animated: true)