클래스와 구조체는 매우 유사하지만 차이점은 구조체는 값 타입인 반면 클래스는 참조 타입이다.
값 타입과 참조 타입
값 타입은 상수나 변수에 할당하거나 함수에 넘겨질 때 복사가 됩니다. 값 타입과는 다르게 참조 타입은 변수나 상수에 할당하거나 함수에 넘길 때 복사하지 않습니다. 복사 대신에 기존에 같은 인스턴스에 참조가 사용됩니다. 즉 값이 복사되는 것이 아니라 메모리를 참조하는 것입니다!
그래서 클래스는 객체를 만들고 프로퍼티 접근해서 값을 변경하면 그 프로퍼티 값이 다 변경된다.
다시 말해 메모리를 참조하기 때문
그리고 Swift 의 클래스는 다중 상속이 안된다는 점을 기억하자.
클래스 예제를 보자
class Sample {
var mutableProperty: Int = 300 // 가변 프로퍼티
let immutableProperty: Int = 300 // 불변 프로퍼티
static var typeProperty: Int = 100 // 타입 프로퍼티
// 인스턴스 메서드
func instanceMethod() {
print("인스턴스 메서드")
}
// 타입 메서드
// 재정의 불가 타입 메서드 - static
static func typeMethod() {
print("타입 메서드")
}
// 재정의 가능 타입 메서드 - class
class func classMethod() {
print("재정의 가능 타입 메서드")
}
}
let x: Sample = Sample()
Sample.typeMethod()
// x.typeMethod() // <-- error
Sample.classMethod()
// x.classMethod() // <-- error
x.instanceMethod()
구조체와 또 다른 점은
var 와 let 으로 선언한 변수와 상관없이
immutableReference.mutableProperty 를 바꿀 수 있다.
'🦜 Swift' 카테고리의 다른 글
[Swift] 클로저 (0) | 2022.11.20 |
---|---|
[Swift] 열거형 (0) | 2022.11.19 |
[Swift] 구조체 (0) | 2022.11.19 |
[Swift] if let vs guard let (0) | 2022.11.19 |
[Swift] guard let (0) | 2022.11.19 |