SwiftUI, UIKit View 사용시 Struct와 Class의 차이
SwiftUI, UIKit View 사용시 Struct와 Class의 차이
Intro
이번 주제는 UIKit을 공부하면서 기존 SwiftUI에서 뷰를 사용할때는 struct로 사용해왔는데 UIKit 에서는 class로 선언하여 사용하게 되었는데 이것에 대해 차이점이 궁금해서 공부하게 되었다.
What is Struct and Class
간단하게 Struct 와 Class의 차이점을 알아보자.
우선 내가 알고 있는 가장 큰 내용은 값타입(value type)과 참조타입(reference type)의 차이점이다.
구조체는 메모리 영역에서 stack영역에 저장되며, 클래스는 참조타입이므로 heap 영역에 저장된다.
구조체는 값을 변경하려면 새로운 메모리를 할당하고 값을 복사해서 새로운 값을 생성하게 되는데, 클래스는 같은 메모리 주소를 참조하기 때문에 값을 변경하게되면 모든 참조가 그 값을 바라보게 된다.
또한 stack은 메모리에 올라갔다가 사용이 종료되면 바로 삭제가 되지만, heap에 올라간 코드는 가비지컬렉터에 의해 정리하게 된다.
UIKit UIView Class
UIKit은 Objective-C에서 시작된, iOS의 전통적인 UI 프레임워크입니다. UIView는 이 프레임워크 내에서 화면에 표시되는 모든 요소의 기본이 되는 클래스입니다. UIView 기반의 개발에서는 주로 명령형 프로그래밍을 사용하며, 애플리케이션의 상태를 관리하고 UI를 업데이트하기 위해 개발자가 직접 뷰의 생명주기를 관리해야 합니다.
import UIKit
class MyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let myView = UIView()
myView.backgroundColor = .red
// 뷰의 위치와 크기를 설정
myView.frame = CGRect(x: 100, y: 100, width: 100, height: 100)
// 뷰를 뷰 컨트롤러의 뷰에 추가
self.view.addSubview(myView)
}
}
SwiftUI View Struct
SwiftUI는 선언형 프로그래밍 패러다임을 기반으로 하는, Swift로 작성된 최신 UI 프레임워크입니다. SwiftUI에서 View는 구조체로 정의되며, 화면에 표시되는 UI 컴포넌트를 구성합니다. View 구조체를 사용함으로써, 개발자는 UI의 상태와 레이아웃을 선언적으로 정의할 수 있으며, 상태가 변경될 때 SwiftUI가 자동으로 UI를 업데이트합니다.
import SwiftUI
struct ContentView: View {
var body: some View {
Text("Hello, SwiftUI!")
.padding()
.background(Color.green)
.cornerRadius(10)
}
}
차이점
- 프로그래밍 패러다임: UIKit의 UIView는 명령형 프로그래밍에, SwiftUI의 View는 선언형 프로그래밍에 기반을 두고 있습니다. 선언형 접근 방식은 UI의 상태를 기술하고, 상태 변화에 따라 UI가 어떻게 변화할지 SwiftUI가 처리하게 합니다. 이는 코드의 가독성과 유지 보수성을 높일 수 있습니다.
- 상태 관리: SwiftUI는 데이터의 상태 변화에 따라 UI를 자동으로 업데이트하는 반응형 프로그래밍을 채택하고 있습니다. 이는 복잡한 상태 관리 로직을 줄이고, 더 간결하고 선언적인 코드 작성을 가능하게 합니다.
- 구조적 차이: UIView는 클래스로서 참조 타입이고, View는 구조체로서 값 타입입니다. 이는 메모리 관리와 성능 측면에서 각각의 장단점을 가집니다.
- 메모리릭에서부터의 안전성
기존의 UIkit에서의 참조타입은 강한상호참조가 일어나는것으로 부터 메모리릭이 많이 발생하고 또한 이러한 위험이 존재한다.
하지만 SwiftUI에서는 값타입인 구조체를 사용하는것으로 이러한 강한상호참조가 일어나지 않기 때문에 메모리릭으로부터 상대적으로 안전하다.
정리
SwiftUI는 최신 프레임워크로서, 선언형 프로그래밍과 강력한 상태 관리 기능을 제공하여, UI 개발의 복잡성을 줄이고 생산성을 높이는 것을 목표로 합니다.
기존의 UIKit에서 UIView의 상속을 해야 했으며 이는 굉장히 많은 프로퍼티와 메소드를 내포하고 있어야 했다.
또한 ARC와 어플리케이션 주기에 관련해서 좀더 자유롭게 설계하려고 하였다.
이를 적용하기 위해서 값타입인 구조체를 사용하였다.
값타입을 통해서 코드 어디에서나 속성을 변경할수 있으며, 자체 책임을 가지고 있게 된다.
뷰가 서로 독립적으로 격리되어 있으며, 이를 통해 특정 보기에 대한 변경 사항은 공통 소스에 의해 구속되지 않는 한 다른 보기에 영향을 미치지 않는다.