0Pricing
Swift Academy · 강의

변경 메서드와 COW 의미론

mutating이 필요한 이유와 Swift의 COW 최적화 작동 방식을 알아봅니다.

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

환영합니다

저장 프로퍼티를 수정하는 구조체 메서드에는 `mutating` 표시가 필요합니다. Swift는 값 의미론을 효율적으로 구현하기 위해 쓰기 시 복사(COW)도 사용합니다.

mutating 키워드

```swift struct Counter { var count = 0 mutating func increment() { count += 1 } mutating func reset() { count = 0 } } var c = Counter() c.increment() // count = 1 ``` `mutating`이 없으면 컴파일러는 `self`를 변경하는 메서드를 거부합니다.

mutating이 필요한 이유

구조체는 값 형식입니다. 구조체를 전달하면 *복사본*을 전달합니다. 메서드가 원래 값을 변경한다는 것을 컴파일러가 알 수 있도록 `mutating`이 필요합니다: ```swift let c = Counter() c.increment() // ❌ cannot use mutating on let ```

mutating에서 self 재할당하기

`mutating` 메서드는 `self` 전체를 다른 값으로 바꿀 수 있습니다: ```swift struct Toggle { var isOn: Bool mutating func flip() { self = Toggle(isOn: !isOn) } } ```

값 의미론: 복사 동작

```swift var a = Counter() var b = a // b is an independent copy a.increment() print(a.count) // 1 print(b.count) // 0 — unaffected ``` 구조체를 할당하면 저장된 모든 프로퍼티가 복사됩니다.

쓰기 시 복사(COW)

Swift의 기본 컬렉션(배열, 사전, 집합, 문자열)은 COW를 사용합니다: ```swift var a = [1,2,3] var b = a // no copy yet — shared storage b.append(4) // NOW a copy is made — a is unchanged print(a) // [1,2,3] print(b) // [1,2,3,4] ```

COW가 중요한 이유

COW가 없다면 구조체를 할당할 때마다 모든 내용이 깊은 복사됩니다. COW를 사용하면 실제 복사를 참조 횟수가 증가하기 전까지 미루므로, 복사 비용이 저렴합니다. 따라서 대부분의 상황에서 값 형식을 참조 형식만큼 빠르게 사용할 수 있습니다.

사용자 정의 COW 구현

```swift struct Buffer { private var storage: NSMutableData private mutating func ensureUnique() { if !isKnownUniquelyReferenced(&storage) { storage = storage.mutableCopy() as! NSMutableData } } mutating func append(_ byte: UInt8) { ensureUnique() // safe to mutate storage now } } ```

mutating과 프로토콜

변경 작업을 수행하는 프로토콜 메서드는 프로토콜에서 `mutating`으로 표시해야 합니다: ```swift protocol Resettable { mutating func reset() } struct Counter: Resettable { var count = 0 mutating func reset() { count = 0 } } ``` 프로토콜을 구현하는 클래스에는 `mutating`이 필요하지 않습니다(클래스는 참조 형식이기 때문입니다).

let 구조체는 완전히 불변입니다

```swift let pt = Point(x: 1, y: 2) pt.x = 3 // ❌ even though x is var inside Point ``` 구조체가 `let`에 저장되면 저장된 프로퍼티를 하나도 변경할 수 없습니다.

확인 문제

Swift의 쓰기 시 복사는 언제 실제로 복사를 수행합니까?

복습

핵심 내용: • `mutating`은 구조체 프로퍼티를 변경하는 메서드를 표시합니다 • `let` 구조체에서는 `mutating` 메서드를 호출할 수 없습니다 • 할당하면 구조체가 복사되며, COW는 컬렉션에서 이 작업을 저렴하게 만듭니다 • COW는 처음 변경할 때만 실제 복사를 수행합니다 • `isKnownUniquelyReferenced`를 사용하여 사용자 정의 COW를 구현할 수 있습니다 과정을 모두 마쳤습니다! 다음: 클래스 상속입니다.

자주 묻는 질문

“변경 메서드와 COW 의미론” 강의는 무료인가요?

네 — “변경 메서드와 COW 의미론” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“변경 메서드와 COW 의미론”에서 뭘 배우나요?

mutating이 필요한 이유와 Swift의 COW 최적화 작동 방식을 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Swift Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“변경 메서드와 COW 의미론” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 멤버별 초기화 구문과 사용자 정의 초기화 구문
  2. 저장 프로퍼티와 프로퍼티 옵저버
  3. 구조체의 계산 프로퍼티
  4. 변경 메서드와 COW 의미론
← Swift Academy(으)로 돌아가기