네이버 부스트캠프 멤버쉽 기간, 더 나아가 모든 개발 기간동안 항상 고민하는 주제인 구현체를 정의할 때 class와 struct의 특징을 확실하게 정리하는 시간을 가져보자.
공통점
Model custom types that encapsulate data.
1) 두 타입 모두 데이터를 캡슐화하는 커스텀 타입 모델이다.
2) 프로퍼티를 정의할 수 있다.
3) 메서드를 정의할 수 있다.
4)생성자를 통해 초기화가 가능하다.
5) extension을 통한 확장이 가능하다.
6) protocol을 채택할 수 있다.
차이점
class | struct | |
type | Reference Type | Value Type |
상송 가능 여부 | O | X |
메모리 할당 위치 | Heap | 대부분 Stack, 특수한 경우 Heap 이용 |
ARC 아래에 관리 | O | X |
deinit을 통한 리소스 해제 | O | X |
⚠️ 여기서 struct가 힙에 저장되는 경우는 어떤 경우 일까?
바로 값 타입을 포함하는 참조 타입일 때 ( class안에 있는 struct일 때) 이다.
이 때 참조 타입인 class가 할당 해제 되기 전에 값 타입인 struct가 할당 해제 되지 않기 위해 값 타입도 힙에 저장된다.
또 다른 참조 타입인 클로저 내부에서도 값타입을 사용한다면 위와 같이 값타임에도 불구하고 힙에 저장된다.
메모리 저장 위치 비교
메모리 저장 위치 즉 Heap과 Stack에 특징과 함께 어떤 상황에서 class와 struct를 선택할 수 있는 지 알아보자
Heap
힙은 동적할당에 사용되는 메모리 영역이므로 동적할당의 특징이 힙의 특징을 대표한다고 할 수 있다.
특징
1) 힙은 낮은 메모리 주소에서 높은 메모리 주소로 할당 된다.
2) 런타임 시 크기가 결정된다.
3) 크기 제한이 없는 대신 속도가 스택에 비해 느리다.
4) ARC로 메모리가 관리되며 메모리 누수 가능성이 있다.
5) 클로저, 클래서등 참조타입 인스턴스를 할당한다.
6) 힙은 스레드의 공유 메모리 영역이기 때문에 스레드 안전성이 부족하다.
Stack
스택은 호출된 함수의 수행을 마치고 복귀할 주소 및 데이터(지역변수, 매개변수, 리턴 값 등)를 임시로 저장하는 공간이다.
특징
1) 스택은 높은 메모리 주소에서 높은 메모리 주소에서 낮은 메모리 주소로 할당된다.
2) 컴파일 시 크기가 결정된다.
3) 스택은 스레드마다 별도 할당이 되기 때문에 스레드 안전성이 충분하다.
정리
그러면 우리는 어떤 상황에서 class
를 쓰고 어떤 상황에 struct
를 써야할까?
Struct 사용
1) 크지 않은 데이터
struct는 스택에 쌓이기 때문에 저장 공간에 한계가 있어 크기가 큰 데이터로는 적절하지 않다.
2) 지역적 변경
불변성의 특징을 이용하여 앱 흐름 내에서 지역적 변경사항이 일어나는 부분에서 많이 사용된다.
가장 대표적인 예로는 네트워크 요청으로 데이터를 보낼 때 사용되거나 네트워크 응답으로 온 데이터 타입으로 사용된다.
Class 사용
1) Objective-C 호환성
swift에서 class는 Objective-C와 상호 운용성이 필요할 때 많이 쓰인다.
개발 초기 Objective-C로 작성된 기능을 위한 API들이 전부 class를 이용하여 작성되었기 때문이다.
2) 여러 곳에서 사용될 때
메모리 효율성 측면에서 객체가 여러 곳에서 참조되며 변경사항이 즉각 반영될 때 class를 사용한다.
소감
보면 볼수록 헷갈렷는데 이번 부스트 캠프를 기회로 많은 개념이 잡혀 진 것 같다.
'프로그래밍언어 > swift' 카테고리의 다른 글
protocol 학습하기 (4) [ any, some ] (0) | 2024.08.25 |
---|---|
protocol 학습하기 (3) [ associatedtype ] (0) | 2024.08.25 |
protocol 학습하기 (2) [ generic, 합성, 채택 체크 ] (0) | 2024.08.25 |
protocol 학습하기 (1) [ property, method, extension ] (0) | 2024.08.24 |
생성자 (0) | 2024.08.24 |