Swift 서적이나 일반적인 차이점에 대해서는 다음과 같이 설명하고 있다.
기본적으로 Struct 는 값 타입, Class 는 참조 타입.
값 타입이란?
- Struct 에서 변수를 할당하면 스택 영역에 값이 저장된다.
- 변수를 복사한 후 복사본을 변경하더라도 원본에 영향을 주지 않는다.
- 힙 영역을 사용하지 않고 레퍼런스 카운팅이 필요하지 않다.
참조 타입이란?
- 스택 영역에는 포인터(레퍼런스)만 할당되고 실제 데이터는 힙 영역에서 할당된다.
- 변수를 복사하더라도 하나의 값을 가리키고 있기 때문에 복사본과 원본이 모두 같은 값을 갖는다.
- 변수를 복사하더라도 레퍼런스 카운트만 +1되고 실제 값이 복사되지는 않는다.
좀 더 쉽게 설명하면,
Struct 로 구성하면, 해당 Struct 에 값이 저장된다. Class 로 구성하면 저장은 다른데 해놓고, 쓸때마다 다른데서 가져와서 쓰는것이다.
Struct 는 복사해서 가져가면 가져간 곳에 또 다른 Struct 가 생기는 셈이니 원본과 복사본이 같을 수가 없지만
Class 는 복사해서 가져가는 게 '다른곳에 저장해 놓은 주소' 를 복사해 간 셈이니, 복사본에서 변경을 하게 되면 '다른데 저장해 놓은 그 값' 자체를 수정하는 게 된다. 그러므로 복사본에서 값을 바뀌면 원본도 같이 바뀔수 밖에 없다.
Swift 에서는 ARC(Auto Reference Counting) 를 통해 메모리를 자체 관리하는 시스템을 가지고 있는데, 여기서 나오는 Reference Counting 는 참조하는 횟수를 관리하는 개념이다. 어떤 특정 변수를 여기 저기서 마구 가져다 쓰고 있는데 가져다 쓰면 쓸수록 메모리에 할당되는 양은 늘어나고, Swift 는 가져다 쓰는 것들을 보면서, 한번 쓰고 안쓰거나 이미 다 쓴것들은 없애는(deinit) 역할을 해줌으로서 메모리를 관리해준다.
Class 는 참조 타입 즉, 기본적으로 Reference Count 를 활용해야만 작동할 수 있는 녀석이다 보니 ARC 에서 집중(?) 관리를 해야 할 수밖에 없고, Struct 는 참조(reference) 개념을 사용하지 않기 때문에 ARC 가 관리할 부분이 없다.
이러한 내용을 알고 보면 아래에 기재한 Struct 와 Class 차이에 대해 좀 더 이해가 쉬울 것 같다.
1. Struct는 상속할 수 없음
2. type casting(is나 as 를 사용하는) 은 class 만 가능
3. deinit (deinitializer) 는 class 에서만 활용 가능
4. reference counting 은 class 에서만 적용
사용중에 아래와 같은 차이를 보았는데, 이건 위에 언급한 '일반적인 차이점' 중 3번에 해당하는 내용인 것 같다.
Struct 는 initializer 를 자동으로 제공하지만 class 는 별도로 초기화 혹은 초기값을 지정해주어야 한다.
잘못된 내용이나 틀린 설명 부분이 있다면 댓글로 꼭 부탁드립니다.
'iOS_Swift' 카테고리의 다른 글
iOS FCM Push Notification .p8 인증서 오류 문제 (0) | 2023.10.31 |
---|---|
WWDC 2022 - KeyNote 확인 후 정리중... (0) | 2022.06.08 |
Swift Memory leak 관리 (1) - lazy var 변수 (0) | 2022.03.22 |
Swift) 키보드 위로 Textfield 따라 올라오게 하기 (2) | 2021.06.02 |
(Swift iOS) 메모리가 늘어나는 현상.. 줄어들질 않는다_Kingfisher (0) | 2020.10.29 |
댓글