1. Swift의 Class와 Struct 기본 개념
Swift에서 Class와 Struct는 데이터와 기능을 캡슐화하여 효율적으로 관리할 수 있도록 합니다. 그러나 이 두 가지는 서로 다른 특성을 지니고 있습니다.
- Class는 참조 타입으로, 객체가 복사되지 않고 동일한 인스턴스를 여러 곳에서 참조할 수 있습니다. 이는 하나의 객체를 여러 위치에서 접근하고 수정할 수 있다는 의미입니다.
- Struct는 값 타입으로, 변수를 전달하거나 복사할 때마다 새로운 인스턴스를 생성하여 독립적인 상태를 유지합니다. 그래서 데이터의 불변성을 유지하고 예상치 못한 데이터 변경을 방지하기에 유리합니다.
2. Class와 Struct의 주요 차이점
특성 | Class | Struct |
---|---|---|
타입 | 참조 타입 | 값 타입 |
상속 | 가능 | 불가능 |
프로토콜 채택 | 가능 | 가능 |
데이터 공유 | 참조를 통해 공유됨 | 값이 복사됨 |
변경 가능성 | 변수로 선언 시 가능 | 기본적으로 불변 (변경하려면 mutating 필요) |
SwiftUI에서 이 차이점들은 매우 중요합니다. 왜냐하면 데이터가 변할 때마다 UI를 자동으로 갱신해 주는 SwiftUI의 동작 방식과 밀접하게 연관되기 때문입니다.
3. SwiftUI에서 Class와 Struct 선택 기준
SwiftUI에서는 대부분의 경우 값 타입(Struct)을 사용하는 것이 더 효율적이며 권장됩니다. SwiftUI는 데이터의 변화가 발생할 때마다 UI를 자동으로 업데이트하는 구조를 가지고 있으며, 값 타입(Struct)이 UI의 업데이트와 상태 관리를 더 용이하게 만듭니다.
다만, 참조가 필요한 상황이나 상태를 공유해야 하는 경우에는 Class를 사용하는 것이 더 적절할 수 있습니다.
4. 간단한 데이터와 상태 관리가 필요한 경우와 참조와 상태 공유가 필요한 경우
간단한 데이터와 상태 관리가 필요한 경우
SwiftUI에서 단순히 뷰 내에서 한 번만 사용되는 데이터나 별도의 저장 및 참조가 필요 없는 데이터의 경우에는 Struct와 값 타입을 사용하는 것이 더 적합합니다. 예를 들어, 버튼을 클릭할 때마다 숫자를 증가시키거나 텍스트를 변경하는 간단한 상태 관리가 필요한 경우입니다.
이 경우 Struct를 사용하는 이유는, 값 타입으로 독립적으로 관리되는 데이터가 SwiftUI의 성능에 더 유리하기 때문입니다. Struct는 데이터를 간편하게 변경할 수 있게 해 주며, 다른 뷰에서 해당 데이터에 접근하거나 수정할 필요가 없으므로 독립적인 상태가 보장됩니다.
참조와 상태 공유가 필요한 경우
애플리케이션에서 여러 화면 또는 뷰에서 동일한 데이터를 참조해야 하는 경우, 또는 데이터가 변경될 때마다 모든 뷰에서 이를 반영해야 하는 경우에는 Class를 사용하는 것이 더 적절합니다. 예를 들어, 사용자 프로필 정보나 설정과 같이 여러 화면에서 동일하게 유지되며, 변경될 가능성이 높은 데이터가 해당됩니다.
이 경우에는 Class를 사용하여 데이터가 하나의 객체로 관리될 수 있도록 하고, 참조 타입의 특성을 활용하여 각 뷰에서 해당 데이터를 공유하는 것이 적합합니다. 이를 통해 모든 화면에서 동일한 데이터를 실시간으로 반영할 수 있습니다.
5. SwiftUI 코드 예제
아래는 Class와 Struct를 사용하는 SwiftUI 예제를 통해 위의 설명을 구체적으로 보여줍니다.
Struct 예제: 간단한 상태 관리
아래 예제에서는 간단한 상태 관리를 위해 Struct와 @State 속성 래퍼를 사용합니다. count
가 변경될 때마다 해당 뷰가 자동으로 업데이트되도록 합니다.
import SwiftUI
struct CounterView: View {
@State private var count = 0
var body: some View {
VStack {
Text("Count: \(count)")
Button("Increment") {
count += 1
}
}
}
}
- 설명: 이 코드에서
count
는CounterView
내부에서만 사용하는 데이터이므로, 별도의 참조나 공유가 필요하지 않습니다. 따라서 Struct로 선언된CounterView
와@State
속성 래퍼를 사용하여 간단한 상태를 관리합니다.
Class 예제: 참조와 상태 공유가 필요한 경우
아래 예제에서는 ObservableObject 프로토콜을 채택한 Class와 @ObservedObject 속성 래퍼를 사용하여 여러 뷰에서 동일한 객체를 참조하고 데이터 변화를 반영할 수 있도록 합니다.
import SwiftUI
import Combine
class CounterModel: ObservableObject {
@Published var count = 0
}
struct ContentView: View {
@ObservedObject var counter = CounterModel()
var body: some View {
VStack {
Text("Count: \(counter.count)")
Button("Increment") {
counter.count += 1
}
}
}
}
- 설명:
CounterModel
은 Class로 선언되었고, ObservableObject 프로토콜을 채택하여 @Published 속성을 사용해count
값을 실시간으로 감지하고 변경할 수 있도록 합니다.ContentView
에서@ObservedObject
를 통해counter
객체를 주입받아, 해당 데이터가 변경될 때마다 UI가 업데이트되도록 합니다.
6. 요약 및 결론
SwiftUI에서 Class와 Struct를 선택할 때는 데이터의 변경 가능성과 공유 필요성을 고려하는 것이 중요합니다.
- 간단한 상태 관리와 독립적인 데이터 사용이 필요한 경우에는 값 타입(Struct)을 사용하는 것이 SwiftUI의 성능과 상태 관리에 유리합니다.
- 여러 뷰에서 데이터를 참조하거나 공유해야 하는 경우에는 참조 타입(Class)을 사용하여 데이터를 하나의 객체로 관리하고, SwiftUI의 @ObservedObject 속성 래퍼와 함께 ObservableObject 프로토콜을 사용하는 것이 적합합니다.
'프로그래밍공부(Programming Study) > IOS 개발' 카테고리의 다른 글
SwiftUI에서 View를 `var`, `struct`, `class`로 선언하는 올바른 방법 (0) | 2024.11.11 |
---|---|
Swift의 `mutating` 키워드, 언제 사용해야 할까? (2) | 2024.11.11 |
Swift에서 클래스의 강한 참조, 약한 참조, unowned 참조 완벽 가이드 (2) | 2024.11.10 |
Swift 클로저와 콜백 함수의 모든 것 - 개념, 문법, 특징, 코드 예제 완벽 정리 (4) | 2024.11.09 |
Swift 프로퍼티 초기화와 앱 진입점의 엄격한 초기화 규칙 (2) | 2024.11.09 |
댓글