안녕하세요 테크지니어22입니다.
오늘은 값형식과 참조형식에 대해서 알아보고자 합니다.
크게 3가지를 알아보도록 하겠습니다.
1. 값 형식
2. 참조 형식
3. 애플은 이 struct를 밀고 있는 이유
값형식(Value Type)
값형식은 변수가 직접 값을 가지고 있는 형식입니다.
실제 데이터는 메모리의 Stack에 할당이 됩니다.
기존에 선언한 let/var 이외에서는 참조를 할수가 없습니다. 이 말은 즉슨 새로운 let/ var에 대입이 되면 복사가 됩니다.
그래서 함수나 메소드의 인자로 넘어가거나 리턴이 되면 복사가 됩니다.
별도의 instance가 생성되기 때문에 사본을 수정해도 원본에 영향을 주지 않습니다.
참조형식(Reference Type)
참조형식은 변수가 객체의 주소를 가리키는 형식입니다.
실제 데이터는 메모리의 Heap에 할당이 되고, Stack에는 실제 데이터를 가리키는 주소가 할당이 됩니다.
선언할 때 사용한 let/ var 이외에서 참조가 가능합니다. 즉 새로운 let/var에 대입되면 참조가 됩니다.
함수나 메소드의 인자로 넘어가거나 리턴되면 참조가 됩니다.
두 변수가 동일한 instance를 가리키기 때문에 사본 혹은 원본을 변경하면 모두 바뀌게 됩니다.
3. 애플은 이 struct를 밀고 있는 이유
값형식은 상태를 관리를 할 필요가 없기 때문에 상태를 없애는 게 핵심인 함수형 프로그래밍 패러다임을 차용하는 언어들에서 많이 사용됩니다.
반대로 참조형식은 상태관리를 할 수 밖에 없기 때문에 상태관리를 하는게 핵심인 객체 지향형 프로그래밍 패러다임을 차용하는 언어들에서 많이 사용됩니다.
Swift는 함수형, 객체 지향형, 프로토콜 지향형 패러다임 3가지를 차용하는 다중 패러다임 언어이기 때문에 둘 다 사용하고 있지만, 애플에서 SwiftUI의 View를 struct로 선언한 것만 보더라도 값형식의 일종인 struct의 사용을 밀고 있음을 알수 있습니다.
그럼 왜 애플은 struct, 즉 값 형식을 밀고 있을까요?
1. mutability control 면에서 class보다 struct가 유리합니다.
- struct는 let으로 선언되면 선언된 변수값 변경 및 member값 변경이 불가합니다.
2. class보다 성능이 유리합니다.
- 레퍼런스 타입의 경우 실제 데이터에 접근하기 위해서는 dereference 과정이 필요한데, value type의 경우 해당 과정이 없으므로 더 빠른 동작이 가능합니다.
- 또한 값 자체가 전달된다고 하더라도 copy on write 기능을 사용하기 때문에 대부분의 경우 성능 향상을 볼 수 있습니다.
Copy On Write
성능 상의 이유로 매번 값을 복사하는 게 아니라 복사본이 변경이 되지 않으면 기존의 값을 사용하고 복사본이 변경이 되면 새로운 instance를 만들고 그 값을 할당합니다.
3. 동시성 프로그래밍시 더욱 안정적인 코드 작성이 가능합니다.
- 값이 복사되기 때문에 data race가 발생할 가능성이 없습니다.
'iOS' 카테고리의 다른 글
[iOS] Combine 프레임워크 (0) | 2025.01.31 |
---|---|
[iOS] 의존성 주입(Dependency Injection) (0) | 2024.08.12 |