Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

Jupyo's Daily Story

mutating 본문

Swift

mutating

JangJupyo 2025. 6. 16. 15:20
728x90
반응형

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