본문 바로가기
프로그램 개발해서 돈벌기/iOS

SwiftUI에서 Class와 Struct 특징 및 차이점

by ubmuhan 2023. 11. 22.
반응형

 

결론부터 보면 Class는 참조타입이고 ARC로 메모리 관리를 합니다. 그리고 Struct는 값 타입입니다.

 

참조와 값에 대한 설명은 아래 글을 참고 바랍니다.

2023.11.19 - [프로그램 개발해서 돈벌기/iOS] - 메모리에 표시되는 값 형식과 참조 형식

 

메모리에 표시되는 값 형식과 참조 형식

값 형식 정수, 실수, 불린, 문자와 같은 기본 자료형과 구조체, 열거형은 값 형식으로 분류합니다. 값 형식으로 선언된 값은 메모리의 스택 영역에 저장됩니다. var a = 10 값 형식으로 저장된 값을

direction-to-money.tistory.com

 

 

Class와 Struct 공통점

  1. 값을 저장할 프로퍼티를 선언할 수 있습니다.
  2. 함수적 기능을 하는 메서드를 선언할 수 있습니다.
  3. 내부 값에 .을 사용하여 접근할 수 있습니다.
  4. 생성자를 사용해 초기 상태를 설정할 수 있습니다.
  5. extension을 사용하여 기능을 확장할 수 있습니다.
  6. 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)")
        }
    }
}

 

 

 

반응형

댓글