시작하기
별칭은 두 변수가 같은 객체를 가리킬 때 발생합니다. 값 타입에서는 이런 일이 발생하지 않지만, 참조 타입에서는 예상하지 못한 버그로 이어질 수 있습니다. 이 차이를 이해하는 것이 중요합니다.
값 타입에는 별칭이 없습니다
```swift
var a = [1,2,3]
var b = a // independent copy
a.append(4)
print(b) // [1,2,3] — unchanged
```
값 타입을 할당할 때마다 독립적인 복사본이 만들어집니다.
참조 타입에서는 DO 별칭이 발생합니다
```swift
class Counter { var value = 0 }
let a = Counter()
let b = a // SAME object
a.value += 1
print(b.value) // 1 — b sees the change!
```
`a`와 `b`는 모두 같은 힙 객체를 가리킵니다.
함수 매개변수에서의 별칭
```swift
func increment(_ c: Counter) { c.value += 1 }
let shared = Counter()
increment(shared)
print(shared.value) // 1 — mutated by the function
```
클래스는 참조로 전달되므로 함수가 원본을 변경합니다.
문제점: 공유되는 변경 가능한 상태
```swift
class Cache { var items: [String] = [] }
var cache = Cache()
var cache2 = cache // aliased!
cache.items.append("data")
print(cache2.items) // ["data"] — unexpected!
```
겉보기에는 관련이 없어 보이는 코드 부분들이 서로 영향을 주는 방식이 바로 이렇습니다.
값 타입으로 해결하기
```swift
struct Cache { var items: [String] = [] }
var cache = Cache()
var cache2 = cache // independent copy
cache.items.append("data")
print(cache2.items) // [] — unaffected
```
복사하는 클래스로 해결하기
```swift
func process(_ c: Counter) {
var local = Counter()
local.value = c.value // copy values, not reference
local.value += 1
}
```
참조 의미론은 필요하지만 별칭은 원하지 않을 때는 값을 명시적으로 복사합니다.
스레드 안전성과 별칭
스레드 간에는 앨리어싱이 특히 위험해집니다:
```swift
// Thread 1:
cache.items.append("a")
// Thread 2 simultaneously:
cache.items.append("b") // ❌ data race!
```
Swift 동시성에서 값 타입은 기본적으로 이 문제를 방지합니다. 변경 가능한 상태를 공유할 수 있는 것은 액터뿐입니다.
의도치 않은 앨리어싱 감지
Xcode의 스레드 살균기(TSan)는 실행 중에 데이터 경쟁을 감지합니다. Scheme > Diagnostics > Thread Sanitizer에서 활성화할 수 있습니다.
Swift 독점성 검사는 실행 중에 `inout` 매개변수의 단일 스레드 앨리어싱 위반을 감지합니다.
의도적인 앨리어싱 패턴
때로는 앨리어싱이 의도적인 경우도 있습니다. 예를 들어 전역 캐시가 그렇습니다:
```swift
class AppCache {
static let shared = AppCache() // intentional shared reference
var data: [String: Any] = [:]
}
```
의도적인 공유는 명확하게 문서화하고, 기본적으로 값 타입을 사용하여 의도치 않은 앨리어싱을 피하십시오.
빠른 확인
클래스 인스턴스를 새 변수에 할당하면 어떻게 됩니까?
복습
핵심 요점:
• 값 타입(구조체) — 할당하면 복사되므로 앨리어싱이 발생할 수 없습니다
• 참조 타입(클래스) — 할당하면 참조를 공유하므로 앨리어싱이 발생할 수 있습니다
• 스레드 간 앨리어싱 = 데이터 경쟁
• 기본적으로 구조체를 사용하고, 공유된 정체성이 필요할 때만 클래스를 사용하십시오
• 문제를 감지하려면 TSan과 Swift 독점성 검사를 사용하십시오
다음: 값 타입과 참조 타입이 섞인 그래프입니다.
자주 묻는 질문
“변경, 공유 및 예기치 않은 별칭” 강의는 무료인가요?
네 — “변경, 공유 및 예기치 않은 별칭” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“변경, 공유 및 예기치 않은 별칭”에서 뭘 배우나요?
공유 참조가 버그를 일으키는 방식과 값 형이 이를 방지하는 방법을 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Swift Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“변경, 공유 및 예기치 않은 별칭” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.