0Pricing
Swift Academy · 강의

변경, 공유 및 예기치 않은 별칭

공유 참조가 버그를 일으키는 방식과 값 형이 이를 방지하는 방법을 알아봅니다.

변경, 공유 및 예기치 않은 별칭은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

시작하기

별칭은 두 변수가 같은 객체를 가리킬 때 발생합니다. 값 타입에서는 이런 일이 발생하지 않지만, 참조 타입에서는 예상하지 못한 버그로 이어질 수 있습니다. 이 차이를 이해하는 것이 중요합니다.

값 타입에는 별칭이 없습니다

```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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 스택과 힙: 값이 저장되는 위치
  2. 변경, 공유 및 예기치 않은 별칭
  3. 값과 참조가 섞인 그래프
  4. 값 의미론을 위한 API 설계
← Swift Academy(으)로 돌아가기