포스트

Swift에서 Class와 Struct의 차이

개요

면접에서 자주 물어보는 질문 중 하나인 Class와 Struct의 차이점에 대해 딥다이브 해봤습니다.

Class와 Struct의 차이

  1. 타입

    • Class는 참조 타입이고, Struct는 값 타입입니다.

      클래스는 참조 타입이기 때문에 인스턴스를 변수나 상수에 할당하거나 함수에 전달할 때, 인스턴스의 참조가 전달 됩니다.

      반면 구조체는 값 타입이기 때문에 인스턴스를 변수나 상수에 할당하거나 함수에 전달할 때, 인스턴스의 복사본이 전달됩니다. 각각의 복사본은 독립적인 인스턴스이므로, 하나의 인스턴스를 수정해도 다른 인스턴스에 영향을 주지 않습니다.

  2. 상속

    • Class는 상속이 가능하지만, Struct는 상속이 불가능합니다.
  3. 메모리

    • Class는 힙 메모리에 저장되고, Struct는 스택 메모리에 저장됩니다.

      클래스의 인스턴스는 항상 힙 메모리에 할당됩니다. Swift에서는 ARC(자동 참조 계산)를 사용하여 메모리 관리를 합니다. ARC는 클래스의 인스턴스가 더 이상 필요하지 않을 때 메모리를 해제합니다.

      구조체 인스턴스는 기본적으로 스택 메모리에 할당됩니다. 스택 메모리는 함수 호출 시 사용되는 메모리로, 함수 호출이 끝나면 메모리가 해제됩니다.

클래스 안에 구조체

그렇다면 만약 클래스 안에 구조체가 있는 경우는 어떻게 될까요 ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class A {
    var b = B()
    init() {
        print("Class A")
    }
}

struct B {
    var value: Int = 0
    init() {
        print("Struct B")
    }
}

let a1 = A()
let a2 = a1

위의 코드를 실행하면, 다음과 같이 동일한 메모리를 참조하고 있음을 알 수 있습니다.

image

그리고 a2.b.value의 값을 변경하면 a1.b.value의 값도 변경됩니다.

즉, 클래스 ‘A’의 인스턴스와 그 내부 프로퍼티인 구조체 ‘B’의 인스턴스 ‘b’는 모두 힙 메모리에 저장됩니다.

구조체 안에 클래스

반대로 구조체 안에 클래스가 있는 경우는 어떻게 될까요 ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class A {
    var value: Int = 0
    init() {
        print("Class A")
    }
}

struct B {
    var value: Int = 0
    var a = A()
    init() {
        print("Struct B")
    }
}

var b1 = B()
var b2 = b1

위의 코드를 실행하면, 클래스 ‘A’의 프로퍼티는 같은 메모리를 참조하고 있음을 알 수 있습니다.

image

여기서 b1의 value와 b1.a의 value를 각각 1로 변경하면, b2는 어떻게 될까요 ?

예상하셨겠지만, b2의 value는 변경되지 않고 b2.a의 value만 변경됩니다.

즉, 구조체 ‘B’의 인스턴스 ‘b1’과 ‘b2’는 각각 스택 메모리에 저장되고, 클래스 ‘A’의 인스턴스 ‘a’는 힙 메모리에 저장된다는 뜻이죠.

결론

  • 클래스는 참조 타입이고, 구조체는 값 타입입니다.

  • 클래스는 상속이 가능하지만, 구조체는 상속이 불가능합니다.

  • 클래스는 힙 메모리에 저장되고, 구조체는 스택 메모리에 저장됩니다.

  • 클래스 안에 구조체가 있는 경우, 클래스와 구조체 모두 힙 메모리에 저장됩니다.

  • 구조체 안에 클래스가 있는 경우, 구조체는 스택 메모리에 저장되고, 클래스는 힙 메모리에 저장됩니다.

이번에는 Class와 Struct의 차이점에 대해 알아보았습니다. 그 중에서도 메모리와 관련된 부분을 중점적으로 살펴보았습니다.

면접에서 꼭 사용할 수 있었으면 좋겠네요. 😊

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.