바야흐로 작년 3월,, 처음 SwiftUI를 접했을 때 익숙한 UIKit과 너무 달라 울고 싶었던 기억이 떠올랐다
예를 들어 상태관리라던가 상태관리라던가 상태관리라던가......
그 근본적인 이유가 Struct와 Class의 차이인데, 그땐 미처 생각하지도 못했다
많은 차이점들이 있지만 SwiftUI와 UIKit에서 느꼈던 Struct와 Class의 차이를 위주로 정리해보려고 한다
✅ 메모리 저장 방식의 근본적 차이
Class (UIKit)
- 힙(Heap) 영역에 저장
- 참조(포인터)를 통해 접근
- 여러 변수가 같은 객체를 가리킬 수 있음
- ARC로 메모리 관리
// UIKit 방식
class UIViewController {
var view: UIView!
var title: String?
}
let vc1 = MyViewController()
let vc2 = vc1 // 같은 객체를 참조
vc2.title = "새 제목"
print(vc1.title) // "새 제목" - 같은 객체라서 함께 변경됨
Struct (SwiftUI)
- 스택(Stack) 영역에 저장 (작은 크기의 경우)
- 값 자체를 복사해서 저장
- 각 변수는 독립적인 값을 가짐
- 자동 메모리 관리 (스택에서 자동 해제)
// SwiftUI 방식
struct ContentView: View {
var title: String = "기본 제목"
var body: some View {
Text(title)
}
}
var view1 = ContentView()
var view2 = view1 // 완전히 새로운 복사본 생성
view2.title = "새 제목"
print(view1.title) // "기본 제목" - 원본은 변경되지 않음
위의 예시에서 title에 새로운 제목을 넣기 위해 @State라든가 @Binding이라든가 하는 상태관리를 위한 프로퍼티 래퍼들을 쓰는 것이다
✅ UIKit에서의 Class 기반 패턴 (상속)
class MainViewController: UIViewController {
func setupUI() {
// 기본 UI 설정
}
}
class HomeViewController: MainViewController {
override func setupUI() {
super.setupUI()
// 홈 화면 전용 UI 추가
}
}
✅ SwiftUI에서의 Struct 기반 패턴 (프로토콜)
protocol Identifiable {
var id: String { get }
}
protocol Displayable {
var title: String { get }
var subtitle: String { get }
}
struct User: Identifiable, Displayable {
let id: String
let name: String
var title: String { name }
var subtitle: String { "사용자" }
}
이 글을 작년의 나에게 바치며,,,
'Swift' 카테고리의 다른 글
[WWDC] ARC in Swift (0) | 2025.05.30 |
---|---|
Struct 접근제어와 Memberwise Initializers (0) | 2025.05.29 |
[Swift]switch문 대신 if, guard 사용하기 (0) | 2025.05.28 |
[Swift] COW 동작 원리 (0) | 2025.05.26 |
[Swift]Optional을 사용하는 이유 (0) | 2025.05.19 |