Swift:
struct
vs class
차이점 정리
두 타입은 문법적으로 유사하지만, 복사 방식, 메모리 관리, 상속, 동시성 등의 차이로 사용 목적이 달라짐
공통점
- 프로퍼티, 메서드, 초기화 가능
- 서브스크립트, 확장(Extension), 프로토콜 채택 가능
Codable
,Equatable
등 프로토콜 사용 가능
핵심 차이점
항목 | struct |
class |
---|---|---|
메모리 타입 | 값 타입 (Value Type) | 참조 타입 (Reference Type) |
복사 방식 | 복사본 생성 (deep copy) | 참조 공유 (shallow copy) |
상속 | ❌ 불가능 | ✅ 가능 |
참조 비교 | ❌ 불가능 | ✅ === 연산자 사용 가능 |
ARC 적용 | ❌ 없음 | ✅ 있음 (메모리 자동 관리) |
mutating 필요 여부 | ✅ 내부 프로퍼티 수정 시 필요 | ❌ 필요 없음 |
스레드 안전성 | ✅ 상대적으로 안전 (복사본 독립적) | ❌ 상태 공유 시 충돌 가능 |
mutating
키워드란?
struct
와enum
은 값 타입이기 때문에 내부 프로퍼티를 수정하려면mutating
키워드가 필요1
2
3
4
5
6
7struct Point {
var x: Int
mutating func moveBy(dx: Int) {
self.x += dx
}
}mutating
이 없으면 컴파일 오류 발생class
에서는 참조 타입이므로 필요 없음
final class
란?
final
키워드를 사용하면 상속을 방지할 수 있다.오버라이딩도 불가능하게 만들어서 안정성과 성능 최적화에 도움된다고한다.
1
2
3
4
5final class UserManager {
func login() {
print("Logging in...")
}
}UserManager
를 상속하려고 하면 컴파일 오류 발생
Struct를 사용하는 경우
사용 조건 | 이유 |
---|---|
상태 불변이 바람직할 때 | 값 복사로 인해 외부 영향을 받지 않음 |
SwiftUI 등 값 기반 UI | View가 자주 생성되며 불변성 유지 필요 |
간단한 데이터 모델링 | 예: 좌표, 날짜, Rect 등 |
Class를 사용하는 경우
사용 조건 | 이유 |
---|---|
참조 공유가 필요할 때 | 같은 인스턴스를 여러 곳에서 접근해야 함 |
상속 구조가 필요할 때 | UIView, NSObject 기반 구조 등 |
복잡한 상태 관리 필요 | 한 곳에서 상태 추적 및 관리 용이 |
요약
항목 | struct | class |
---|---|---|
타입 | 값 타입 | 참조 타입 |
복사 | 복사본 | 참조 공유 |
상속 | ❌ | ✅ 가능 |
ARC | ❌ 없음 | ✅ 적용됨 |
내부 수정 제한 | mutating 필요 |
자유롭게 수정 가능 |
상속 방지 | 사용 불가 (기본 불가능) | final 로 명시적 차단 가능 |
Swift에서는 구조적으로 struct
를 기본으로 선택하고, 참조가 필요하거나, 상속이 필요한 경우에만 class
를 사용하는 것이 권장되는 방식이라고 한다. 다행히 struct를 선호해서 많이 사용하고는 있었지만, 사용시 명확히 알고 사용하기!