본문 바로가기

Apple

[Swift] UIKit는 Class가 많고 SwiftUI는 Struct 가 많은 이유는?

카페에 어떤 분이 물어본 질문이다. 

UIKit의 view나 control의 데이터타입은 거의 class인데 SwiftUI의 데이터타입은 거의 struct 이네요.
클래스와 구조체의 차이점은 야곰님 스위프트책에서 대충 피상적으로만 이해했습니다.
프레임웍이 SwiftUI로 넘어오면서 struct로 전격 교체된 이유가 궁금합니다.

지원하는 버전을 보면  UIKit보다 SwiftUI가 나중에 나왔다는 것을 알 수 있다.

  AppKit UIKit SwiftUI
iOS N/A 2.0+ 13.0+
macOS 10.0+ N/A 10.15+
Mac Catalyst 13.0+ 13.0+ 13.0+
tvOS N/A 9.0+ 13.0+
watchOS N/A 2.0+ 6.0+

AppKit (Application Kit)은 원래 NeXTStep 에서 가져온 GUI(Graphical User Interface) 툴킷이다.

OS X로는 Cocoa, iOS로는 Cocoa Touch 라는 이름으로 이식되었다.

프레임워크 라이브러리를 보면 유독 NS라는 이름의 접두어를 볼 수 있는데 이것은 NeXTStep의 줄임말로 알려져있다.

Swift 3이 릴리즈되면서 많은 클래스들의 이름에서 NS를 떼어버리려고 하고 있다. (예. NSURL -> URL, NSData -> Data)

이러한 NS접두어의 클래스는 기존 Objective-C 코드의 사용을 위해 당분간은 남겨둘 것이지만 점차 없어져 나가지 않을까 생각한다.

 

이미 Struct와 Class의 차이에 대해서는 레퍼런스 문서에 잘 정리가 되어 있다.

Comparing Structures and Classes (The Swift programming language 5.3)

영어 문서를 읽는 것에 부담이 있다면 해당 레퍼런스의 내용이 들어가있는 한국어로 적혀있는 블로그 글들을 보는 것도 좋을 것 같다.

- Swift :: 구조체와 클래스 차이 (struct VS class)

- Class vs Struct in Swift

 

결론적으로는 값 타입인지(Struct), 참조 타입(Class)이지에서 오는 특성들로 인해 여러가지 선택의 수준이 달라진다.

 

Choosing Between Structures and Classes 라는 애플의 글에도 적혀있지만 기본적으로 Struct를 고려해본다.

  Struct Class
Class를 써야할 이유(상속, deinitialize 등)가 아니라면...  
Objective-C와의 상호운영을 필요로 한다면  
모델링한 데이터의 identity의 컨트롤이 필요하다면  
데이터의 공유등 멀티 쓰레드 환경이라면  

이런 상황으로 보면 애플에서는 점차적으로 Objective-C를 줄이고 Swift 쪽으로 비중으로 늘릴 것 같은 생각이 든다.

1983년 브래드 콕스가 만들었는데 iPhone이 등장하고 나서 갑자기 떠올라서 2014년에는 12.87%까지 점유했었다.

Objective-C의 TIOBE index

2011년과 2012년에는 올해의 프로그래밍언어에도 연속 등급했지만...

하지만 WWDC 2014에서 새로운 프로그래밍 언어인 Swift가 나오면서 애플 생태계에는 Swift가 주력이 되면서 Objective-C는 다시 감소해서 쇠퇴하지 않을까 예상해본다.