구조체와 클래스 (struct, class)
- 구조체(struct)
- 값 타입(value type) - 값이 복사됨
- 상속 불가능
- deinit 없음
- 참조카운팅 없음
- Swift의 대부분의 데이터 타입은 구조체로 작성되어 있다
- 클래스(class)
- 참조 타입(reference type) - 인스턴스를 참조하여 공유함
- 상속 가능
- deinit 있음
- 참조 카운팅 있음
가장 큰 차이점은 값/참조 타입이다. -> 이에 대한 자세한 내용은 후에 나온다.
B.U.T. 구글링해서 좀 알아보고 읽으면 이해가 더! 잘될 것이라 생각한다.
클래스 vs 구조체
struct PersonStruct{
var name: String
}
class PersonClass{
var name: String
deinit{
print("소멸됐어염")
}
}
let structPerson = PersonStruct(name: "tree")
let classPerson = PersonClass(name: "tree")
var classPersonVar = PersonClass(name: "tree")
structPerson.name = "randy" // 변경 불가, 값 타입을 상수로 선언 시, 내부 프로퍼티 또한 변경할 수 없다
classPerson.name = "randy" // 변경 가능, 참조 타입을 상수로 선언 시, 참조하는 포인터(?)를 가진 classPerson만 변경이 불가
classPersonVar.name = "randy" // 가능
classPersonVar = nil // 소멸됐어염
간단하게만 차이를 알아보자
구조체 | 클래스 | |
메모리 영역 | Stack | Heap |
속도 | 빠름 | 느림 |
상속 | 불가능 | 가능 |
선택하기
- 애플은 가이드 라인에서 다음 조건 중 하나 이상에 해당한다면 구조체를 사용하라고 권장한다
- 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적일 때
- 캡슐화한 값을 참조하는 것보다 복사하는 것이 합당할 때
- 구조체에 저장된 프로퍼티가 값 타입이며, 참조하는 것보다 복사하는 것이 합당할 때
- 상속받거나 상속할 필요가 없을 때
스위프트의 데이터 타입들이 대부분 구조체라서 속도가 빠른 건 알겠어!
B.U.T. 쓸데없이 메모리를 많이 잡아 먹는 것 아냐? 매개변수로든 치환이든 다 복사해서 메모리에 올라가잖아?
-> 스위프트는 꼭 필요한 경우에만 "진짜 복사"를 한다고 한다.
-> 진짜 복사 : 메모리에 실제로 데이터를 복사하여 올리는 것
-> 스위프트가 적절히 효율적으로 처리한다고 하는데 그에 대한 기준은 모르겠다... 나중에 시간나면 찾아보는 걸로...
-> 혹여나 이걸 보는 사람은 없겠지만, 혹시라도 보다가 궁금해서 찾게되면 저도 알려주세요..bb
'Swift' 카테고리의 다른 글
[Swift] 인스턴스 - 스위프트 언어 및 문법(7) - feat.야곰's Swift Programming (0) | 2021.01.14 |
---|---|
[Swift] 프로퍼티/메서드 - 스위프트 언어 및 문법(6) - feat.야곰's Swift Programming (0) | 2021.01.14 |
[Swift] 옵셔널 - 스위프트 언어 및 문법(4) - feat.야곰's Swift Programming (0) | 2021.01.14 |
[Swift] 함수/메서드 - 스위프트 언어 및 문법(3) - feat.야곰's Swift Programming (0) | 2021.01.14 |
[Swift] 데이터타입 - 스위프트 언어 및 문법(2) - feat.야곰's Swift Programming (0) | 2021.01.14 |