-
[Swift] - Swift에서 클래스 내부 구조체의 메모리 위치와 성능 차이iOS/SWIFT 2025. 5. 3. 10:13728x90반응형
✍️ 목차
- 개요
- 클래스와 구조체의 메모리 차이
- 클래스 내부의 구조체는 어디에 저장될까?
- 구조체 복사와 성능 영향
- 정리
1. 개요
Swift는 값 타입(struct)과 참조 타입(class)을 명확히 구분하는 언어임.
이번 포스트에서는 클래스 내부에 포함된 구조체 인스턴스가 메모리상 어디에 저장되는지,
그리고 구조체 복사가 성능에 어떤 영향을 미치는지에 대해 살펴보자.
2. 클래스와 구조체의 메모리 차이
🔹 클래스 (Reference Type)
- 인스턴스는 Heap에 저장됨
- 변수는 Heap에 있는 객체의 **포인터(reference)**를 stack에 저장
- ARC(Automatic Reference Counting)로 메모리 관리됨
🔹 구조체 (Value Type)
- 인스턴스는 Stack에 저장됨
- 값이 복사되어 전달됨 (COW 최적화 예외 존재)
- 스코프를 벗어나면 자동으로 해제됨
3. 클래스 내부의 구조체는 어디에 저장될까?
다음과 같은 코드가 있다고 해보자.
class A { var num = 0 var point = Point(x: 1, y: 2) struct Point { var x: Int var y: Int } }let a = A()이때 메모리 구조는 다음과 같다.
[a] (stack 변수) └───▶ [A 인스턴스] (heap 객체) ├── num: Int └── point: Point (Heap 내부에 inline 저장) ├── x: Int └── y: Int구조체(point)는 값 타입이지만, 클래스 인스턴스(A)가 Heap에 있으므로 구조체도 클래스 인스턴스 내부에 함께 힙에 저장된다.
4. 구조체 복사와 성능 영향
구조체는 값 타입이기 때문에 다음과 같은 경우 복사가 발생한다.
struct Point { var x: Int var y: Int } let a = A() var copied = a.point // ✅ 복사 발생 copied.x = 100 // 원본 a.point.x 는 그대로- 구조체 복사는 Stack 또는 레지스터 수준에서 처리되므로 매우 빠르다.
- 하지만 구조체의 크기가 크고, 반복적으로 복사가 일어나는 경우에는 성능에 영향을 줄 수 있다.
- Swift 표준 라이브러리의 Array, String, Dictionary 등은 COW(Copy-On-Write)로 최적화되어 있지만, 일반 구조체에는 해당되지 않는다.
5. 정리
항목 클래스(class) 구조체(struct) 저장 위치 Heap Stack (단, 클래스 내부에 있으면 Heap) 전달 방식 참조 값 복사 복사 시점 명시적 대입 시 참조 공유 대입/함수 인자 등에서 복사 발생 성능 영향 ARC 오버헤드 있음 크기 크면 복사 비용 발생 가능 최적화 여부 ARC + Inline 가능성 COW는 일부 표준 타입에 한정 ✅ 마무리
- 구조체가 항상 Stack에 저장되는 것이 아니라, 소유 주체가 Heap이면 구조체도 Heap에 포함된다는 점을 명심해야 한다.
- 값 타입이라도 무조건 성능이 더 좋은 것은 아니며, 복사 비용, 사용 패턴, 캡처 방식 등을 고려해 선택하는 것이 중요하다.
Swift에서 구조체와 클래스의 성능과 메모리 모델을 정확히 이해하면, 더 나은 설계와 최적화를 이끌 수 있다.
'iOS > SWIFT' 카테고리의 다른 글
[Swift] - Swift의 Task, @MainActor, Task.detached 정리: 언제, 왜, 어떻게 써야 할까? (0) 2025.05.03 [Swift] - 배열 루프를 순회하는 방식(enumerated,indices,Range(0..<arr.count)) (0) 2025.03.20 [Swift] - Character와 EGC(Extended Grapheme Cluster) (0) 2025.03.14 [Swift] - mutating (0) 2024.02.06 [SWIFT] - 제네릭(Generic) (0) 2023.06.14