Swift 자료구조에는 두가지의 타입이 존재한다. 바로 값타입과 참조타입인데, 오늘은 이 둘의 차이를 메모리에 저장되는 관점에서 살펴보도록 하겠다
구조체, 튜플, 열거형, 컬렉션 타입이 있는데
그 중 대표적인 구조체를 기준으로 설명하겠다
// 구조체 (값 타입)
struct UserStruct {
var ID: String
var level: Int
init(ID: String, Lv: Int) {
self.ID = ID
self.level = Lv
}
}
var userStruct: UserStruct = UserStruct(ID: "hong", LV: 20)
클래스와 클로저가 있는데,
그 중 대표적인 클래스를 기준으로 설명하겠다.
// 구조체 (값 타입)
class UserClass {
var ID: String
var level: Int
init(ID: String, Lv: Int) {
self.ID = ID
self.level = Lv
}
}
var userClass: UserClass = UserClass(ID: "hong", LV: 20)
메모리 영역이 서로 다르게 저장되는데, 실질적 차이를 알기 위해선 새로운 객체를 만들어 값을 복사해보면 알 수 있다.
var userStructCopy = userStruct
var userClassCopy = userClass
userStructCopy.Lv = 15
userClassCopy.Lv = 15
print(userStruct.Lv) // 20
print(userClass.Lv) // 15
똑같이 내부 프로퍼티의 값을 변경했지만
값타입의 경우 서로 다른 인스턴스가 되어 개별적으로 값이 저장됨
참조타입의 경우 같은 메모리 주소를 가리키기 때문에 기존에 생성된 인스턴스이 값이 변경됨!
값타입은 원본 데이터를 저장하고, 참조타입은 원본 데이터의 메모리 주소를 저장한다!