[SwiftUI] 스위프트 UI가 Struct를 사용하는 이유

반응형

    처음 스위프트 UI를 사용하면 죄다 Struct로 구성되는 것을 보고 조금 익숙하지 않을 수 있습니다. 그러나 계속 공부를 하다 보면 왜 그런지 알게 되는데 그 이유를 5가지로 정리해 보겠습니다.

    struct ContentView: View {
        @State private var count = 0
    
        var body: some View {
            VStack {
                Text("Hello")
            }
        }
    }

     

     

    1. Struct는 단순합니다.

    일단 스트럭트는 클래스에 비해 가볍습니다. 그리고 구조자체가 단순합니다. 이는 값타입이기 때문에 복사도 쉽고 참조타입인 클래스보다 메모리에도 사용에도 유리합니다. 이는 성능에 영향을 주고 아무래도 스토리보드나 xib로 만들어진 커다란 객체 덩어리 보다 훨씬 가볍고 구조적으로 UI를 만들 수 있으며 동시에 재사용도 쉽습니다.

     

    2. Struct는 상속을 하지 않습니다.

    상속을 하지 않는다는 것은 달리 보면 불편할 것 같긴 하지만 스위프트에는 modifer라는 개념이 있어 마치 확장을 하듯 기능을 추가할 수 있으며 재사용성도 탁월합니다. 또한 클래스처럼 상속을 하지 않기 때문에 UIView와 같은 다양한 속성이 있는 객체를 상속받지 않고도 화면을 렌더링 할 수 있습니다. (UIView 관련 속성망 200개가 넘습니다.)

     

    3. 가변성을 최소화합니다.

    가변성을 최소화하면 프로그램 실행 중에 상태가 변화하는 것을 최소화해서 프로그램의 복잡성을 줄일 수 있고 단순하게 구성할 수 있습니다. 아마도 개발을 조금 해보신 분은 프로그램 상태 지옥에 빠진 적이 한두 번이 아닐 겁니다. 불변성을 유지하는 프로그래밍 스타일은 함수형 프로그래밍의 가장 큰 특징 중 하나입니다.

     

    4. 레퍼런스 타입이 아닙니다.

    클래스처럼 상속도 받지 않으며 더욱이 Struct의 경우 값 타입이기 때문에 갖게 되는 여러 가지 장점이 있습니다. 레퍼런스 타입의 경우 실제 값을 외부에서 변경할 수 있게 되는데 이는 편리함도 있겠지만 제한이 없이 사용하는 경우 역시 문제가 발생할 가능성이 높아집니다. 그래서 레퍼런스 타입을 사용하면서 발생하는 문제점을 최소 하는 장점이 있습니다.

     

    5. 메모리 닉에 안정적입니다.

    레퍼런스 타입의 경우 스위프트 언어 내부적으로 가비지 컬렉터가 없기 때문에 레퍼런스 카운팅을 하고 있는데 클로저와 같은 기능들을 사용하면서 순환 참조 문제가 발생하고 결국 메모리 닉이 발생할 수 있습니다. 이러한 retain cycle 때문에 발생하는 문제점을 최소화하고 안전한 프로그래밍이 가능합니다.

    반응형

    댓글

    Designed by JB FACTORY