반응형
사전캠프 과제를 통해 한 번도 사용해보지 않은 mutating 키워드에 대해 다시 한 번 깊이 알아보자.
Swift에서 mutating 키워드는 구조체(struct) 또는 열거형(enum) 내부에서 인스턴스의 속성을 변경할 수 있도록 해주는 키워드
mutating 키워드가 필요한 이유
Swift의 구조체(struct)와 열거형(enum)은 값 타입(value type) 이므로, 메서드 내에서 인스턴스의 속성을 변경하려고 하면 기본적으로 컴파일 에러가 발생합니다.
struct Counter {
var value: Int = 0
func increment() {
value += 1 // ❌ 오류: 구조체의 속성을 변경할 수 없음
}
}
mutating 키워드 사용법
struct Counter {
var value: Int = 0
mutating func increment() {
value += 1 // ✅ 정상적으로 값 변경 가능
}
}
var counter = Counter()
counter.increment()
print(counter.value) // 1
mutating 키워드를 추가하면 메서드 내부에서 self를 변경할 수 있으며, 구조체의 속성 값을 변경할 수 있습니다.
self의 재할당도 가능
mutating을 사용하면 기존 속성 값만 변경하는 것이 아니라, 자체를 새로운 인스턴스로 교체할 수도 있습니다.
struct Point {
var x: Int
var y: Int
mutating func move(toX newX: Int, toY newY: Int) {
self = Point(x: newX, y: newY) // ✅ 새로운 인스턴스로 교체 가능
}
}
var point = Point(x: 3, y: 4)
point.move(toX: 10, toY: 20)
print(point) // Point(x: 10, y: 20)
self = ... 를 사용하여 인스턴스를 새로운 값으로 변경할 수도 있습니다.
mutating과 열거형(enum)
mutating 키워드는 열거형(enum)에서도 사용할 수 있으며, 열거형의 case를 변경할 때 필요합니다.
enum LightSwitch {
case on, off
mutating func toggle() {
self = (self == .on) ? .off : .on
}
}
var light = LightSwitch.off
light.toggle()
print(light) // on
self = ...를 사용하여 현재 상태를 변경할 수 있습니다.
mutating의 제한 사항
- 클래스(class)에서는 mutating을 사용할 수 없음
- mutating은 값 타입인 struct와 enum에서만 사용됩니다.
- class는 참조 타입이므로 인스턴스 내부의 속성을 자유롭게 변경할 수 있기 때문입니다.
- 상수(let) 구조체 인스턴스에서는 mutating 메서드를 호출할 수 없음
- mutating 메서드는 속성을 변경하므로, let으로 선언된 구조체에서는 호출할 수 없습니다.
struct Counter {
var value: Int = 0
mutating func increment() {
value += 1
}
}
let counter = Counter()
// counter.increment() // ❌ 오류: let 인스턴스에서는 mutating 메서드 호출 불가
언제 mutating을 사용해야 할까? 🤔
- 구조체의 속성을 변경해야 하는 메서드를 만들 때
- 구조체 내부에서 self를 새로운 값으로 대체해야 할 때
- enum에서 self를 다른 case로 변경할 때
언제 mutating이 필요 없는가? 🚫
속성을 변경하지 않는 메서드라면 mutating이 필요 없음
struct Person {
var name: String
func introduce() { // ✅ mutating 필요 없음 (속성 변경 X)
print("안녕하세요, 제 이름은 \(name)입니다.")
}
}
클래스(class)에서는 mutating을 사용할 필요 없음
- 클래스는 참조 타입이라서, 메서드 내부에서 속성을 변경해도 문제 없음
class Car {
var brand: String
init(brand: String) {
self.brand = brand
}
func updateBrand(to newBrand: String) { // ✅ mutating 불필요
self.brand = newBrand
}
}
값을 변경하는 메서드가 필요하지 않다면 mutating을 쓸 필요 없음
struct Rectangle {
var width: Double
var height: Double
func area() -> Double { // ✅ mutating 불필요 (속성 변경 X)
return width * height
}
}
핵심 정리 ✨
✅ mutating은 필수가 아니다!
✅ 값을 변경하는 메서드에서만 필요하다!
✅ 구조체(struct)나 열거형(enum)에서만 사용한다!
✅ 클래스(class)에서는 필요 없다!
즉, "이 메서드에서 속성을 바꿔야 하나?" 를 고민해 보고, 바꿀 필요가 있다면 mutating을 붙이면 된다 ! 🚀
반응형
'iOS > Swift' 카테고리의 다른 글
[ Swift ] Override (0) | 2025.02.06 |
---|---|
[ Swift ] stride, reduce (0) | 2024.05.30 |
[ Swift ] Zip 함수 (0) | 2024.05.29 |
[ Swift ] prefix와 suffix (0) | 2024.05.28 |