소개글
iOS 개발을 하면서 헷갈렸던 개념들을 다시 정리해보고 있습니다.
만약 틀린 내용이 있다면 피드백은 언제나 환영합니다.
더 자세하고 알고싶다면 아래쪽 참고사이트에서 확인하면 좋을 것 같습니다!
말투는 편한 말투로 작성하니 양해 부탁드립니다.
Struct, Class
Struct vs Class (vs Actor)
Struct 특징
- Value 타입
- 프로퍼티를 변화시키는 메소드를 정의할 때는 mutating 키워드를 써줘야함
- Swift의 몇몇 구조체(Int, Array 등)에서는 최적화를 위해 Copy-On-Write 방식을 쓰고 있음
- Copy-On-Write: 다른 변수에 값을 할당하면 일단 복사하지 않고 같은 곳을 바라보고 있다가, 값이 변경할 때 실제로 복사를 하고 값을 변경함
- Copy-On-Write에서 mutating 키워드는 해당 메소드가 호출된다면 실제 복사를 해야한다고 알려주는 역할
Class 특징
- Reference 타입
- 상속할 수 있음
- 타입 캐스팅이 가능함
- 인스턴스에 참조 횟수 계산이 적용됨
- deinit이 호출됨
Value타입과 Reference 타입이기 때문에 따라오는 특성들도 많이 있습니다.
이는 밑에서 이어서 설명하겠습니다.
Actor 특징
- Class와 전체적으로 비슷하지만 스레드로부터 안전하다는 점이 다름
Actor는 Swift의 Async에서 사용되는 용어긴 하지만 Class와 비슷하여 넣었습니다.
Struct를 사용하면 좋은 경우 (애플 문서)
- 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적일 경우
- 캡슐화한 값을 참조하는 것보다 복사하는 것이 합당할 때
- 구조체에 저장된 프로퍼티가 값 타입이며, 참조하는 것보다 복사하는것이 합당할 때
- 다른 타입으로부터 상속받거나, 자신을 상속할 필요가 없을 때
Class를 사용하면 좋은 경우
- 그 외의 경우
- Objectice-C와 상호 운용성을 원할 때
Value vs Reference
Value 타입 특징
- 값을 할당하거나 전달할 때 복사본을 넘김 (한개의 인스턴스 내부의 값을 변경하면 그것만 변경됨)
- Struct, Enum, String, Int 등이 있음
- Stack에 저장됨
- 스레드로부터 안전함 (멀티스레드 환경에서 각자 자신의 Stack을 가지고 있기 때문)
- 비교적 더 빠름
Reference 타입 특징
- 값을 할당하거나 전달할 때 참조를 넘김 (한개의 인스턴스 내부의 값을 변경하면 나머지도 다 변경됨)
- Class, Function 등이 있음
- Heap에 저장됨
- 스레드로부터 안전하지 않음 → 동기화 처리 필요 (멀티스레드 환경에서 Heap은 공유되기 때문)
- 비교적 더 느림 (동기화 처리로 인한 오버헤드 발생)
Value 타입을 포함하는 Reference 타입
- 예시로는 Struct 변수를 가진 Class
- Reference 타입이 소멸하기 전까지 Value 타입도 Heap에 저장됨
Reference 타입을 포함하는 Value 타입
- 예시로는 Class 변수를 가진 Struct
- Stack에 저장되긴 하지만 참조 카운팅이 이루어짐
참고 사이트
https://icksw.tistory.com/256
https://infinitt.tistory.com/392
https://velog.io/@wonhee010/mutating