Jupyo's Daily Story
mutating 본문
Swift에서 구조체(struct)와 열거형(enum)을 다룰 때 사용하게 되는 mutating 키워드에 대해서 알아보겠습니다.
mutating은 무엇인가요?
Swift에서 구조체(struct)와 열거형(enum)은 값 타입(Value Type)입니다. 값 타입의 인스턴스는 기본적으로 내부의 프로퍼티를 변경할 수 없습니다. 즉, 불변(immutable)한 특성을 가집니다.
하지만 때로는 구조체나 열거형 내부의 메서드에서 해당 인스턴스의 프로퍼티 값을 변경해야 할 필요가 생깁니다.
이때 사용하는 키워드가 바로 mutating입니다.
간단히 말해, mutating은 "이 메서드는 이 인스턴스의 값을 변경할 수 있습니다!" 라고 Swift 컴파일러에게 알려주는 역할을 합니다.
왜 mutating이 필요할까요?
Swift는 안전하고 예측 가능한 코드를 작성하도록 돕습니다. 만약 값 타입의 메서드가 마음대로 내부 값을 변경할 수 있다면, 코드의 흐름을 추적하기 어렵고 예상치 못한 버그가 발생할 수 있습니다.
mutating 키워드를 사용함으로써, 개발자는 어떤 메서드가 인스턴스의 상태를 변경하는지 명확하게 알 수 있고, 컴파일러는 값 타입의 불변성을 유지하면서도 필요한 경우에만 변경을 허용하도록 제어할 수 있습니다.
예시로 이해하기
struct Point {
var x: Int
var y: Int
// mutating 키워드가 없으면 이 메서드에서 x, y 값을 변경할 수 없습니다.
mutating func moveBy(deltaX: Int, deltaY: Int) {
x += deltaX
y += deltaY
}
// mutating이 필요 없는 예시: 값을 변경하지 않고 단순히 출력만 합니다.
func describe() {
print("현재 위치는 (\(x), \(y)) 입니다.")
}
}
var myPoint = Point(x: 10, y: 20)
myPoint.describe() // "현재 위치는 (10, 20) 입니다."
myPoint.moveBy(deltaX: 5, deltaY: -3) // mutating 메서드 호출
myPoint.describe() // "현재 위치는 (15, 17) 입니다."
// 참고 : let으로 선언된 Point 인스턴스는 mutating 메서드를 호출할 수 없습니다.
// let fixedPoint = Point(x: 0, y: 0)
// fixedPoint.moveBy(deltaX: 1, deltaY: 1) // 컴파일 오류
위 예시에서 moveBy 메서드는 Point 구조체의 x와 y 프로퍼티 값을 변경합니다. 따라서 이 메서드 앞에는 mutating 키워드가 붙어야 합니다. 만약 mutating 키워드를 빼고 x += deltaX와 같은 코드를 작성하면 컴파일 오류가 발생합니다.
반면 describe 메서드는 단순히 x와 y 값을 읽어서 출력만 하므로 mutating 키워드가 필요 없습니다.
클래스(Class)에는 왜 mutating이 없을까요?
클래스는 참조 타입(Reference Type)입니다. 참조 타입의 인스턴스는 기본적으로 가변(mutable)합니다.
즉, 클래스 내부의 메서드는 mutating 키워드 없이도 얼마든지 인스턴스의 프로퍼티 값을 변경할 수 있습니다.
이것이 값 타입과 참조 타입의 중요한 차이점 중 하나입니다.
마무리
mutating 키워드는 Swift의 값 타입이 안전하면서도 유연하게 동작할 수 있도록 돕는 중요한 개념입니다. 특히 구조체를 자주 사용하는 Swift 개발자라면 이 키워드의 역할을 정확히 이해하는 것이 필수적입니다.
'Swift' 카테고리의 다른 글
고차 함수(Higher-Order Functions) (0) | 2025.06.12 |
---|---|
@MainActor (2) | 2025.06.05 |
프로토콜 (Protocols) (0) | 2024.11.10 |
static, class, final class 프로퍼티/메서드 (2) | 2024.10.26 |
생명주기 (Lifecycle) (2) | 2024.10.14 |