ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Swift] - Swift에서 클래스 내부 구조체의 메모리 위치와 성능 차이
    iOS/SWIFT 2025. 5. 3. 10:13
    728x90
    반응형

    ✍️ 목차

     

    1. 개요
    2. 클래스와 구조체의 메모리 차이
    3. 클래스 내부의 구조체는 어디에 저장될까?
    4. 구조체 복사와 성능 영향
    5. 정리

     

    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에서 구조체와 클래스의 성능과 메모리 모델을 정확히 이해하면, 더 나은 설계와 최적화를 이끌 수 있다.

Designed by Tistory.