Swift 구조체
스위프트 구조체 개요
구조체 ≒ 클래스
공통점:
- 객체지향 프로그래밍의 기초를 형성(프로퍼티 정의, 값 저장, 메서드 정의)
- 데이터와 기능을 재사용
- 캡슐화하는 방법 제공
- 프로토콜 채택
- 초기화
- 확장 가능
차이점: struct 키워드 사용
struct SampleStruct {
var name: String
init(name: String) {
self.name = name
}
}
<클래스>
class SampleClass {
var name: String
init(name: String) {
self.name = name
}
}
인스턴스 생성
let myStruct = SampleStruct(name: "Mark")
let myClass = SampleClass(name: "Mark")
값 타입 vs 참조 타입
구조체 - 값 타입(value type)
클래스 - 참조 타입(reference type)
값 타입: 원본 구조체 인스턴스와는 별개인 복사본을 복사 -> 다른 복사본들에 영향x
struct SampleStruct {
var name: String
init(name: String) {
self.name = name
}
}
let myStruct1 = SampleStruct(name: "Mark")
var myStruct2 = myStruct1
myStruct2.name = "David"
print(myStruct1.name) //Mark
print(myStruct2.name) //David
myStruct2는 myStruct1의 복사본이기 때문에 myStruct2의 name만 변경
참조 타입: 클래스 인스턴스가 있는 메모리의 위치에 대한 참조체가 생성 및 전달 -> 모든 참조체의 데이터 변경
class SampleClass {
var name: String
init(name: String) {
self.name = name
}
}
let myClass1 = SampleClass(name: "Mark")
var myClass2 = myClass1
myClass2.name = "David"
print(myClass1.name) //David
print(myClass2.name) //David
동일한 클래스 인스턴스에 대한 참조체들이기 때문에 MyClass1과 myClass2 모두에 영향을 미침
다른 차이점
구조체
- 효율적
- 멀티 스레드 코드를 사용하는데 더 안정적
클래스
- 상속, 하위 클래스 지원
- 소멸자 메서드(deinit) 포함
- 런타임에서 클래스 타입을 식별