티스토리 뷰
Swift 개발을 하다 보면 자연스럽게 구조체(struct) 를 많이 사용하게 됩니다. Apple의 프레임워크나 Swift 표준 라이브러리도 struct 기반으로 설계된 부분이 많고, SwiftUI 역시 Value Semantic 위에서 동작한다고 해도 과언이 아닙니다.
오늘은 이 Value Semantic이 무엇인지, 왜 중요한지, 그리고 Swift가 이를 통해 어떤 장점을 얻는지 정리해보려고 합니다.
그럼 시작해보겠습니다.
✅ 1. Value Semantic이란?
Value Semantic은 값을 전달할 때 실제 값이 복사되어 전달되는 방식을 의미합니다.
즉, 복사본을 주고받기 때문에 변경이 원본에 영향을 끼치지 않습니다.
이 단순한 개념이 Swift의 안전성, 예측 가능성, 그리고 SwiftUI의 효율적인 UI 업데이트의 기반이 됩니다.
struct Flower {
var name: String = "장미"
}
let x = Flower()
var y = x
y.name = "해바라기"
print(x.name) // 장미
print(y.name) // 해바라기
✅ 2. Value Semantic이 중요한 이유
Swift에서 Value Semantic이 중요한 이유는 크게 세 가지로 나눌 수 있습니다.
1. 상태 변화 예측(Predictibility)
값 타입은 복사되어 사용되기 때문에 원본은 독립적인 상태를 유지합니다.
그래서 의도하지 않은 곳에서 값이 바뀌는 일이 거의 없습니다.
반면 class와 같이 참조 기반 타입은 여러 변수가 같은 인스턴스를 공유하므로, 내가 모르는 곳에서 값이 변경될 수 있습니다.
이런 이유로 Swift는 가능한 많은 타입을 struct로 설계하고 있습니다.
class Human {
var name: String
init(name: String) {
self.name = name
}
}
let x = Human(name: "김철수")
let y = x
y.name = "김영희"
print(x.name) // 김영희
2. 멀티스레딩(Concurrency) 친화성
Swift Concurrency는 data race(데이터 충돌) 를 방지하도록 설계되었습니다.
Value 타입은 복사본을 사용하므로 여러 스레드에서 접근해도 충돌 위험이 거의 없습니다.
반면 Reference 타입은 공유되는 상태를 관리해야 해서 아래와 같은 안전장치가 필요합니다.
- lock
- DispatchQueue.sync
- actor
- mutex 등
Swift가 구조체를 권장하는 가장 큰 이유 중 하나가 바로 이 멀티스레드 안전성입니다.
3. 안전성(Safety)
값 타입은 서로 상태를 공유하지 않기 때문에 부작용이 매우 적습니다.
이 덕분에 상태 변화가 어디에서 일어났는지 추적하기가 쉬워집니다.
SwiftUI처럼 “상태 기반 UI 프레임워크”가 struct를 사용하는 이유도 바로 이것입니다.
UI가 예측 가능해지고, 업데이트 동작이 명확해지기 때문이죠.
+ Copy and Write(COW)
“값이 복사된다면 매번 메모리 복사가 일어나서 비효율적이지 않을까?” 라는 의문이 들 수 있지만, Swift는 Array, Dictionary, Set, String 같은 struct 타입에서 Copy on Write(COW) 최적화를 제공합니다.
COW는 값이 실제로 변경되기 전까지는 메모리를 복사하지 않고, 원본 리소스를 공유하는 방식입니다.
즉, “실제로 수정되는 순간에만 복사” 하는 셈이죠.
이 덕분에 Swift는 값 타입의 안정성 + 참조 타입의 성능 을 동시에 챙길 수 있습니다.
✅ 3. Struct는 Data Race가 발생하지 않는다?
그러면 무조건 Class 대신 Struct를 사용하면 Data Race가 발생하지 않는걸까요?
또 그렇지만은 않은게, 아래 코드와 같이 mutating으로 선언된 함수에 여러 스레드에서 동시에 접근하게 된다면 Struct 또한 data race를 발생시키게 됩니다.
struct Human {
var age: Int = 20
mutating func nextYear() {
self.age += 1
}
}
var human = Human()
DispatchQueue.global().async {
human.nextYear()
}
human.nextYear()
그럼 대체 어떻게 해야 Data race를 방지할 수 있을까요?
이를 위해 Swift에서는 Actor라는 새로운 Data Type을 발표하였는데 자세한 내용은 다음 글에서 다뤄보도록 하겠습니다.
정리하자면, Swift의 Value Semantic은 언어의 철학과 성능, 안전성을 지탱하는 매우 중요한 개념입니다.
특히 SwiftUI처럼 상태 기반으로 동작하는 프레임워크에서는 더더욱 핵심적인 기반이 됩니다.
이렇게 오늘은 Swift의 핵심 개념중 하나인 Value Semantic에 대해 알아보았습니다.
감사합니다.
'Swift' 카테고리의 다른 글
| Swift - @frozen과 @unknown default (0) | 2026.04.22 |
|---|---|
| Swift - RunLoop와 Timer 원리 이해하기 (0) | 2026.04.15 |
| 앨범 만들기 6편 - AVFoundation이란? (0) | 2025.11.28 |
| 앨범 만들기 5편 - Transitioning Delegate 를 통한 화면전환 애니메이션 구현편 (0) | 2025.11.12 |
| 앨범 만들기 4편 - Transitioning Delegate 를 통한 화면전환 애니메이션 개념편 (1) | 2025.11.07 |
- Total
- Today
- Yesterday
- CD/CI
- GradientDescent
- iphone
- 스위프트
- Actor
- AI
- tuist v4
- 경사하강법
- 인공신경망
- SwiftUI
- kakaomapssdk
- Tuist
- 코어데이터
- webrtc
- CacheLocality
- coredata
- ViewBuilder
- Concurrency
- opaquetype
- Algorithm
- 동시성
- 알고리즘
- swift
- Xcode
- BoxedType
- opaque
- ios
- nonisolated
- 역전파
- SocialLogin
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 |
