결론부터 보면 Class는 참조타입이고 ARC로 메모리 관리를 합니다. 그리고 Struct는 값 타입입니다.
참조와 값에 대한 설명은 아래 글을 참고 바랍니다.
2023.11.19 - [프로그램 개발해서 돈벌기/iOS] - 메모리에 표시되는 값 형식과 참조 형식
메모리에 표시되는 값 형식과 참조 형식
값 형식 정수, 실수, 불린, 문자와 같은 기본 자료형과 구조체, 열거형은 값 형식으로 분류합니다. 값 형식으로 선언된 값은 메모리의 스택 영역에 저장됩니다. var a = 10 값 형식으로 저장된 값을
direction-to-money.tistory.com
Class와 Struct 공통점
- 값을 저장할 프로퍼티를 선언할 수 있습니다.
- 함수적 기능을 하는 메서드를 선언할 수 있습니다.
- 내부 값에 .을 사용하여 접근할 수 있습니다.
- 생성자를 사용해 초기 상태를 설정할 수 있습니다.
- extension을 사용하여 기능을 확장할 수 있습니다.
- Protocol을 채택하여 기능을 설정할 수 있습니다.
Class와 Struct 차이점
Class | Struct |
- 참조 타입 - ARC로 메모리 관리 - 같은 클래스 인스턴스를 여러 개 변수에 할당한 뒤 값을 변경 시키면 할당한 모든 변수에 영향을 줌(메로리만 복사) - 상속 가능 - 타입 캐스팅을 통해 런타임에서 클래스 인스턴스 타입을 확인할 수 있음 - deinit을 사용하여 클래스 인스턴스 메모리 할당을 해제함 - 참조 카운팅을 통해 여러 참조를 관리 - 런타임에서 타입 변환이 가능하므로 인스턴스의 타입을 확인하거나 다른 클래스로 변환 |
- 값 타입 - 구조체 변수를 새로운 변수에 할당할 때마다 새로운 구조체가 할당됨 (같은 구조체를 여러 개 변수에 할당한 뒤 값을 변경시켜도 다른 변수에 영향을 주지 않음 - 값 자체를 복사) |
Class와 Struct 값 변경 및 변화에 대한 샘플 코드
class SimpleClass {
var count: Int = 0
deinit {
print("할당 해제")
}
}
struct SimpleStruct {
var count: Int = 0
}
var class1 = SimpleClass()
var class2 = class1
var class3 = class1
class3.count = 3
print(class1.count) // class3의 값을 변경했지만 참조타입이므로 class1도 변경 되는 것을 볼 수 있습니다.
var struct1 = SimpleStruct()
var struct2 = struct1
var struct3 = struct1
struct2.count = 2
struct3.count = 3
print(struct1.count) // 0
print(struct2.count) // 2 <- 구조체는 값 타입이므로 항상 새로운 메모리가 할당됩니다.
print(struct3.count) // 3
SwiftUI에서 Class와 Struct 차이점
SwiftUI에서 Struct 특징
값 타입인 struct로 선언된 SwiftUI View는 뷰의 body가 업데이트될 때마다 새로운 인스턴스가 생성되며, 이는 뷰의 상태가 변경될 때마다 새로운 뷰 트리가 생성되는 결과를 가져옵니다.
SwiftUI에서 Class 특징
class로 선언된 타입은 참조 타입이므로, 상태 변경 시 동일한 인스턴스가 유지됩니다. 이는 상태 관리에 사용되는 ObservableObject와 같은 프로토콜을 구현하는 데 주로 사용됩니다.
SwiftUI에서 Struct 샘플 코드
ContentView는 struct로 선언되었고, counter라는 상태 변수를 가지고 있습니다. 버튼을 누를 때마다 counter의 값이 증가하면서 ContentView의 body가 업데이트되고, 이에 따라 새로운 ContentView 인스턴스가 생성됩니다.
struct ContentView: View {
@State private var counter = 0
var body: some View {
Button(action: {
self.counter += 1
}) {
Text("Counter is \(counter)")
}
}
}
SwiftUI에서 Struct에서 Class 선언 및 사용한 샘플 코드
CounterViewModel은 class로 선언되었고, ObservableObject 프로토콜을 채택하였습니다. ContentView는 이 ViewModel을 관찰하며, ViewModel의 상태가 변경되면 ContentView의 body가 업데이트됩니다. 그러나 ViewModel 자체는 참조 타입이므로, 상태가 변경되어도 동일한 ViewModel 인스턴스가 유지됩니다.
class CounterViewModel: ObservableObject {
@Published var counter: Int = 0
func incrementCounter() {
counter += 1
}
}
struct ContentView: View {
@ObservedObject var viewModel = CounterViewModel()
var body: some View {
Button(action: {
viewModel.incrementCounter()
}) {
Text("Counter is \(viewModel.counter)")
}
}
}
'프로그램 개발해서 돈벌기 > iOS' 카테고리의 다른 글
tvOS에서 화면 좌우(왼쪽, 오른쪽) 화면 분할 및 오른쪽 뷰 포커싱 시 왼쪽 뷰 폭 조정 (0) | 2023.11.23 |
---|---|
[Swift] SwiftUI에서 두 개 뷰에서 @Published, ObservableObject, @StateObjec, @EnvironmentObject를 이용한 데이터 Combine 사용하기 (0) | 2023.11.23 |
메모리에 표시되는 값 형식과 참조 형식 (0) | 2023.11.19 |
메모리 개념과 사이즈 용어 및 메모리 영역별 사용처 (0) | 2023.11.19 |
SwiftUI에서 그리드 아이템을 한꺼번에 보여 주지 않고 12 개씩 나누어서 보여 주기 (0) | 2023.11.13 |
댓글