구조체
- 데이터와 기능을 재사용할 수 있는 객체로 캡슐화 방법 제공
- 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)
→ 구조체 인스턴스가 복사되거나 메서드에 전달될 때, 인스턴스의 실제 복사본이 생성됨
원본 객체가 가지고 있던 모든 데이터를 그대로 복사해서 갖게 됨
즉, 복사본은 원본 구조체 인스턴스와 별개인 자신만의 데이터를 가짐
→ 하나의 인스턴스를 변경해도 다른 복사본 인스턴스에 영향을 미치지 않음
- 이와 반대로 클래스는 참조 타입이기 때문에 복사되거나 인자로 전달되면 인스턴스가 있는 메모리의 위치에 대한 참조체가 만들어지거나 전달됨
- 따라서 참조체가 변경되면 원본 인스턴스에도 동일한 작업이 수행 됨
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) // Daivd
→ struct는 값 타입이기 때문에 복사하더라도 원본과 다른 값을 가질 수 있음
클래스 (class)
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
구조체 특징
- 상속이나 하위 클래스를 지원하지 않음
- 하나의 구조체가 다른 구조체에 상속될 수 없음
- 소멸자 메서드 (deinit)를 포함할 수 없음
- 런타임에서 클래스 인스턴스의 유형을 식별할 수는 있지만, 구조체는 그렇지 않음
구조체 vs 클래스 (차이점)
- 구조체가 클래스보다 효율적이고 멀티 스레드 코드를 사용하는 데 안정적 → 구조체 권장
- 상속이 필요하거나 데이터가 캡슐화된 하나의 인스턴스가 필요할 때 → 클래스 사용
- 인스턴스가 소멸될 때 리소스 확보 작업이 필요한 경우 → 클래스 사용
'Swift' 카테고리의 다른 글
Swift - 9. 배열과 딕셔너리 (1) | 2024.01.06 |
---|---|
Swift - 8. 프로퍼티 래퍼 (0) | 2023.12.29 |
Swift - 6. 서브 클래싱과 익스텐션 개요 (0) | 2023.12.28 |
Swift - 5. 객체 지향 프로그래밍 기초 (0) | 2023.12.27 |
Swift - 4. 함수, 메서드, 클로저 개요 (1) | 2023.12.26 |