[야우쓰] 1주차(5) Value Type vs Reference Type

hello_hidi·2022년 11월 14일
0

야우쓰

목록 보기
5/20
post-thumbnail

Value Type vs Reference Type

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)
  • User 구조체는 Data 메모리 영역에 생성된다.
  • 스택 메모리 영역에 userHong이라는 인스턴스가 생성된다.

참조타입

클래스와 클로저가 있는데,
그 중 대표적인 클래스를 기준으로 설명하겠다.

// 구조체 (값 타입)
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)
  • User 클래스는 Data 메모리 영역에 생성된다.
  • heap 메모리 영역에 생성된 인스턴스의 데이터를 정한다.
  • stack 메모리에서는 단지 heap 영역에 있는 실제 인스턴스의 메모리 주소를 저장하고 있을 뿐!

실제 차이점은?

메모리 영역이 서로 다르게 저장되는데, 실질적 차이를 알기 위해선 새로운 객체를 만들어 값을 복사해보면 알 수 있다.

값 복제

var userStructCopy = userStruct
var userClassCopy = userClass
  • 값타입은 복사하면 새로운 값이 할당되어 stack 메모리에 쌓임
  • 참조타입은 새로운 값이 할당되지 않고 똑같이 ehap 메모리 영역에 생성된 인스턴스 메모리 주소 복사

복제값 내부 프로퍼티 변경

userStructCopy.Lv = 15
userClassCopy.Lv = 15

print(userStruct.Lv)  // 20
print(userClass.Lv) // 15

똑같이 내부 프로퍼티의 값을 변경했지만
값타입의 경우 서로 다른 인스턴스가 되어 개별적으로 값이 저장됨
참조타입의 경우 같은 메모리 주소를 가리키기 때문에 기존에 생성된 인스턴스이 값이 변경됨!

결론

값타입은 원본 데이터를 저장하고, 참조타입은 원본 데이터의 메모리 주소를 저장한다!

let 키워드

  • 값타입은 원본 데이터 타입을 저장하고 있기 때문에 내부 프로퍼티 변경 x
  • 참조타입은 원본 데이터의 메모리만 저장하기 때문에 내부 프로퍼티 변경 o
profile
안뇽희디

0개의 댓글