티스토리 뷰
데이터를 용도에 맞게 표현하고자 할 때 사용
가장 큰 차이점
구조체의 인스턴스 = 값(value)
클래스의 인스턴스 = 참조(reference)
스위프트의 데이터 타입과 열거형은 모두 "값" 타입
참조는 C언어의 포인터와 유사한 개념
Struct (구조체)
구조체를 let으로 선언하면 인스턴스 내부의 프로퍼티 값을 변경할 수 없음
var로 선언하면 프로퍼티가 var일 경우 변경 가능
Class (클래스)
클래스를 let으로 선언하면 인스턴스 내부의 프로퍼티 값을 변경할 수 있음
클래스의 인스턴스는 참조 타입이므로 참조할 필요가 없을 때 메모리에서 해제됨 -> deinit 호출
공통점
- 프로퍼티와 메서드를 정의할 수 있음
- *서브스크립트를 정의할 수 있음
- 이니셜라이저를 정의할 수 있음
- 익스텐션 사용 가능
- 프로토콜 준수 가능
차이점
- 구조체 = 상속할 수 없음
- 클래스의 인스턴스 = 타입캐스팅이 가능
- 클래스의 인스턴스 = 디이니셜라이저 활용
- 클래스의 인스턴스 = Reference Counting 적용
값 타입
값이 복사되어 전달됨 -> 서로 다른 값
참조 타입
주소가 전달됨 -> 서로 같은 값
struct PersonStruct {
let name: String
var age: Int
}
class PersonClass {
let name: String = "B"
var age: Int = 10
}
var a1: PersonStruct = PersonStruct(name: "A", age: 10)
var a2: PersonStruct = a1
a2.age = 20
print(a1.name, a1.age)
print(a2.name, a2.age)
//A 10
//A 20
var b1: PersonClass = PersonClass()
var b2: PersonClass = b1
b1.age = 20
print(b1.name, b1.age)
print(b2.name, b2.age)
// B 20
// B 20
//식별 연산자, 참조가 같은지 확인
print(b1 === b2)
//true
활용
구조체를 사용하는 경우 (애플 가이드라인)
- 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적일 때
- 참조보다 복사가 합당할 때
- 구조체에 저장된 프로퍼티가 값 타입
- 상속이 필요 없을 때
구조체라서 복사할 때 메모리가 비효율적일 것 같지만 꼭 필요한 경우만 "진짜 복사"를 하는 방식으로 스위프트가 알아서 효율적으로 처리함
퍼포먼스 관련 글:
https://baechukim.tistory.com/81
참고 도서
m.yes24.com/Goods/Detail/78907450
*서브스크립트 : 클래스, 구조체, 열거형에는 컬렉션, 리스트, 시퀀스 등 타입의 요소에 접근하는 단축 문법정의 가능
예를 들어 someArray[index] 는 Array인스턴스의 index를 통해 값에 접근하는 것! -> 서브스크립트
'Swift' 카테고리의 다른 글
[Swift] 상속 (0) | 2021.05.01 |
---|---|
[Swift] 접근제어 (0) | 2021.05.01 |
[Swift] Swift 언어의 특징 (0) | 2021.05.01 |
[Swift] Delegation이란? (0) | 2021.04.09 |
[Swift] @escaping closure, 탈출 클로저 쉽게 이해하기 (0) | 2021.01.22 |
댓글
공지사항