Post

struct와 class의 차이점

struct와 class의 차이점

Swift에서 structclass의 차이 – 언제 어떤 타입을 써야 할까?

Swift에서는 데이터 모델을 만들 때 structclass 두 가지 타입 중 선택할 수 있다. 둘은 비슷해 보이지만, 실제로는 메모리 관리, 동작 방식, 사용 용도에서 중요한 차이가 있다.

이 글에서는 structclass의 차이를 정리하고, 언제 어떤 상황에서 선택해야 하는지 기준을 제시한다.


1. 타입의 본질: 값 타입 vs 참조 타입

구분structclass
메모리 특성값 타입 (Value Type)참조 타입 (Reference Type)

✅ struct는 복사된다

1
2
3
4
5
6
7
8
9
10
struct A {
    var value: Int
}

var a = A(value: 10)
var b = a
b.value = 20

print(a.value) // 10
print(b.value) // 20

ab는 완전히 다른 복사본

✅ class는 참조된다

1
2
3
4
5
6
7
8
9
10
11
class B {
    var value: Int
    init(value: Int) { self.value = value }
}

var a = B(value: 10)
var b = a
b.value = 20

print(a.value) // 20
print(b.value) // 20

ab는 같은 인스턴스를 가리킨다


2. 상속 가능 여부

구분structclass
상속불가능가능

클래스는 객체지향 패러다임의 핵심 기능인 상속을 지원한다. 구조체는 상속을 지원하지 않지만, 프로토콜을 통해 유사한 기능은 가능하다.


3. 소멸자(deinit)의 유무

구분structclass
소멸자없음있음 (deinit)

클래스는 객체가 메모리에서 해제될 때 실행되는 소멸자(deinitializer) 를 지원한다.

1
2
3
4
5
class Sangjin {
    deinit {
        print("인스턴스 해제됨")
    }
}

→ 구조체는 메모리에서 해제되더라도 deinit을 사용할 수 없다.


4. mutating 키워드

구조체는 내부 속성을 변경하려면 mutating 키워드를 사용해야 한다.

1
2
3
4
5
6
7
8
9
10
struct Sangjin {
    var name: String
    
    mutating func changeName(to newName: String) {
        self.name = newName
    }
}

var s = Sangjin(name: "sangjin")
s.changeName(to: "cha sangjin")

클래스는 참조 타입이므로 mutating 없이 속성 변경이 가능하다.


5. === 연산자: 인스턴스 비교

구분structclass
=== 연산자 사용불가능가능

클래스는 인스턴스의 메모리 주소 비교가 가능하다.

1
2
3
4
5
6
7
class A {}
let a = A()
let b = a
let c = A()

print(a === b) // true
print(a === c) // false

→ 구조체는 값 복사이므로 === 같은 비교는 불가능하다.


언제 struct를 쓰고 언제 class를 써야 할까?

struct를 사용해야 할 경우

  • 값이 변경되지 않고, 복사되는 것이 의도된 경우
  • 데이터 중심 모델 (예: 좌표, 크기, 색상 등)
  • 스레드 안정성(thread safety)이 중요한 경우

class를 사용해야 할 경우

  • 상속이 필요한 경우
  • 여러 곳에서 같은 인스턴스를 공유해야 하는 경우
  • 객체의 생명주기 관리를 직접 제어해야 하는 경우 (deinit 필요 등)

마무리

Swift에서 structclass는 단순한 문법 선택이 아니다. 값 타입 vs 참조 타입, 불변 vs 변경 가능, 가벼운 구조체 vs 복잡한 객체 모델 등 명확한 목적에 따라 선택해야 한다.

값 중심의 불변 데이터를 다룰 때는 struct, 동작 중심의 복잡한 객체를 다룰 때는 class를 사용하자.

This post is licensed under CC BY 4.0 by the author.