티스토리 뷰
Swift에는 4가지 기본 인터페이스가 있다. 가장 추상적인 인터페이스인 protocol부터 OOP에서 가장 많이 사용하는 class, 그리고 struct, enum 등이 있다. C++에서 struct와 enum은 기본 자료형을 묶어서 구조체로 만들거나 숫자 리터럴을 키워드로 변경하기 위한 용도 등으로 사용했지만 Swift는 좀 더 많은 기능을 가지고 있다. 예를 들어 struct와 enum 모두 class처럼 함수를 가질 수 있다.
이로써 struct와 class의 경계가 모호해졌다고 볼 수 있지만 여전히 두 인터페이스는 다른 사용성을 가지고 있다.
차이점
value type vs reference type
struct는 value type이고 class는 reference type이다.
때문에 struct는 함수의 파라미터로 전달될 때 값이 통째로 복사되어 전달되고, class는 메모리 주소가 복사되어 함수 내에서도 동일한 메모리에 접근할 수 있다. 즉, struct를 전달받은 함수에서 아무리 값을 바꿔도 외부에 있는 struct 인스턴스는 전혀 영향을 받지 않지만 class를 전달받은 함수에서 class의 내용을 변경하면, 외부에서도 그 변경이 적용된다.
상속 받을 수 있는 인터페이스의 제한
struct는 protocol만 상속 받을 수 있고, class는 protocol 또는 다른 class를 상속 받을 수 있다.
이유는 type의 차이를 생각해 보면 유추할 수 있는데, value type은 함수와 변수의 선언만 할 수 있는 protocol만 상속 받아서 언제나 같은 크기의 데이터를 정의할 수 있고, reference type은 protocol 뿐 아니라 다른 class를 상속 받아서 데이터의 크기가 커져도 변경된 크기에 따라 동적으로 메모리를 할당할 수 있다.
궁금한 점
struct가 class의 인스턴스를 가지고 있으면 어떻게 될까
struct는 class를 상속받을 수는 없지만 class의 인스턴스를 멤버로 가지고 있을 수 있다. class 인스턴스를 가지고 있는 struct를 복사하면 어떻게 될까?
class Cls {
var index: Int = 0
// 1
init() {
print("init")
}
deinit {
print("deinit")
}
func increase() {
index += 1
}
}
struct Stt {
var number: Int
// 2
let cls: Cls
func show() {
print("\(number) \(cls.index)")
}
}
// 3
var s1 = Stt(number: 5, cls: Cls()) // init
s1.show() // 5 0
s1.cls.increase()
s1.show() // 5 1
- class Cls의 생성자와 소멸자가 실행될 때 알 수 있도록 print()를 추가한다.
- struct Stt가 class Cls의 인스턴스를 가지고 있다.
- struct Stt의 인스턴스를 생성하고 Cls.index를 증가시켰다.
여기에서 s1을 복사하면 어떻게 될까?
// 1
var s2 = s1 // copy
s2.show() // 5 1
// 2
s2.cls.increase()
s1.show() // 5 2
- s2에 s1 struct를 복사한 후 출력해보면 그대로 5 1이 출력된다.
- s2.cls.index를 증가시키고 s1을 출력해도 변화가 적용된 것을 볼 수 있다.
그렇다면 이 경우 Cls의 메모리는 언제 해제될까? 메모리 해제 시점을 알아보기 위해 미리 deinit()에 print()를 추가해 두었다.
// 1
var s1 = Stt(cls: Cls())
var s2 = Stt(cls: Cls()) // deinit
- s1, s2 모두 새로운 Stt를 대입하면 s2에 대입했을 때 deinit이 출력된다. 즉, s1의 값이 s2로 복사되면서 cls에 대한 ARC가 증가했다는 뜻이다.
'Programming > Swift' 카테고리의 다른 글
Swift Expert | Codable (0) | 2020.12.02 |
---|---|
Swift Beginner | 인터페이스 (0) | 2020.11.18 |
Swift Beginner | 타입캐스팅 is as (0) | 2020.11.18 |
Swift Beginner | 함수의 시작과 끝 guard defer (0) | 2020.11.18 |
Swift Beginner | Closure (0) | 2020.11.18 |
- Total
- Today
- Yesterday
- scala
- 자료구조
- machine learing
- 운영체제
- Cocos2d-x
- mongoDB
- OS
- winsock
- ue4
- 드라마
- database
- 데이터베이스
- game
- Git
- SwiftUI
- C
- Spring
- 국내여행
- swift
- 수학
- DesignPattern
- SOCKET
- C/C++
- C++
- ios
- SHADER
- rxswift
- Java
- JSP
- 알고리즘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |