Swift

Struct와 Class 차이(부제: 내가 SwiftUI가 어려웠던 이유)

양밀루 2025. 5. 27. 21:40

바야흐로 작년 3월,, 처음 SwiftUI를 접했을 때 익숙한 UIKit과 너무 달라 울고 싶었던 기억이 떠올랐다

예를 들어 상태관리라던가 상태관리라던가 상태관리라던가......

그 근본적인 이유가 Struct와 Class의 차이인데, 그땐 미처 생각하지도 못했다

 

많은 차이점들이 있지만 SwiftUI와 UIKit에서 느꼈던 Struct와 Class의 차이를 위주로 정리해보려고 한다

 


✅ 메모리 저장 방식의 근본적 차이

Class (UIKit) 

  • 힙(Heap) 영역에 저장
  • 참조(포인터)를 통해 접근
  • 여러 변수가 같은 객체를 가리킬 수 있음
  • ARC로 메모리 관리
// UIKit 방식
class UIViewController {
    var view: UIView!
    var title: String?
}

let vc1 = MyViewController()
let vc2 = vc1  // 같은 객체를 참조
vc2.title = "새 제목"
print(vc1.title)  // "새 제목" - 같은 객체라서 함께 변경됨

 

 

Struct (SwiftUI)

  • 스택(Stack) 영역에 저장 (작은 크기의 경우)
  • 값 자체를 복사해서 저장
  • 각 변수는 독립적인 값을 가짐
  • 자동 메모리 관리 (스택에서 자동 해제)
// SwiftUI 방식
struct ContentView: View {
    var title: String = "기본 제목"
    
    var body: some View {
        Text(title)
    }
}

var view1 = ContentView()
var view2 = view1  // 완전히 새로운 복사본 생성
view2.title = "새 제목"
print(view1.title)  // "기본 제목" - 원본은 변경되지 않음

 

위의 예시에서 title에 새로운 제목을 넣기 위해 @State라든가 @Binding이라든가 하는 상태관리를 위한 프로퍼티 래퍼들을 쓰는 것이다

 

 

 UIKit에서의 Class 기반 패턴 (상속)

class MainViewController: UIViewController {
    func setupUI() {
        // 기본 UI 설정
    }
}

class HomeViewController: MainViewController {
    override func setupUI() {
        super.setupUI()
        // 홈 화면 전용 UI 추가
    }
}

 

 

 SwiftUI에서의 Struct 기반 패턴 (프로토콜)

protocol Identifiable {
    var id: String { get }
}

protocol Displayable {
    var title: String { get }
    var subtitle: String { get }
}

struct User: Identifiable, Displayable {
    let id: String
    let name: String
    
    var title: String { name }
    var subtitle: String { "사용자" }
}

 

 

이 글을 작년의 나에게 바치며,,,

'Swift' 카테고리의 다른 글

[WWDC] ARC in Swift  (0) 2025.05.30
Struct 접근제어와 Memberwise Initializers  (0) 2025.05.29
[Swift]switch문 대신 if, guard 사용하기  (0) 2025.05.28
[Swift] COW 동작 원리  (0) 2025.05.26
[Swift]Optional을 사용하는 이유  (0) 2025.05.19