Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
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
Archives
Today
Total
관리 메뉴

J

[Swift] mutating 본문

Swift

[Swift] mutating

yujaehui 2024. 4. 12. 01:15

1. mutating 키워드란?

Swift에서 구조체(struct)와 열거형(enum)은 값 타입. 기본적으로 값 타입은 인스턴스의 프로퍼티를 직접 수정할 수 없음.

이를 해결하기 위해 Swift에서는 mutating 키워드를 통해, 구조체 또는 열거형의 메서드에서 인스턴스 자체를 수정할 수 있도록 함.


2. mutating의 역할

  • 구조체나 열거형의 프로퍼티를 수정할 수 있도록 메서드에 선언.
  • 메서드가 호출될 때, 인스턴스의 새로운 복사본을 생성하고, 그 복사본을 수정.

3. 문법

mutating 키워드는 메서드 정의 앞에 추가.

struct Counter {
    var count = 0

    mutating func increment() {
        count += 1
    }
}

var counter = Counter()
counter.increment()

print(counter.count) // 1

4. 사용 예제

1. 구조체의 프로퍼티 수정

struct Point {
    var x: Int
    var y: Int

    mutating func moveBy(x deltaX: Int, y deltaY: Int) {
        x += deltaX
        y += deltaY
    }
}

var point = Point(x: 0, y: 0)
point.moveBy(x: 10, y: 5)

print(point) // Point(x: 10, y: 5)

 

2. 열거형의 값 변경

enum Direction {
    case north, south, east, west

    mutating func turnRight() {
        switch self {
        case .north:
            self = .east
        case .east:
            self = .south
        case .south:
            self = .west
        case .west:
            self = .north
        }
    }
}

var direction = Direction.north
direction.turnRight()

print(direction) // east

5. mutating 메서드의 제한 사항

1. 상수 인스턴스에서는 호출 불가

mutating 메서드는 변경 가능한 변수(var)에서만 호출 가능하며, 상수(let)에서는 호출할 수 없음.

struct Counter {
    var count = 0

    mutating func increment() {
        count += 1
    }
}

let counter = Counter()
// counter.increment() // 오류: 상수에서는 호출 불가

 

2. 클래스에서는 사용 불필요

클래스는 참조 타입이므로, 메서드 내부에서 프로퍼티를 자유롭게 수정이 가능하기 때문에.


6. mutating과 inout의 차이점

  mutating inout
적용 대상 구조체/열거형의 인스턴스 메서드 함수의 파라미터
수정 방식 구조체 내부에서 자기 자신을 수정 함수 외부의 값을 수정
호출 시 동작 메서드 호출 시 내부에서만 적용 호출부에서 &를 사용해 값 전달

 


7. mutating이 필요한 이유

Swift의 값 타입(구조체와 열거형)은 불변성을 기본으로 함.

이는 코드의 안전성을 높이고, 예상치 못한 값 변경을 방지하기 위함.

mutating 키워드는 이러한 기본 동작을 유지하면서도, 필요한 경우 특정 메서드에서 값을 변경할 수 있도록 함.


8. 언제 mutating을 사용할까?

  • 값 타입에서 상태를 변경해야 하는 동작이 필요할 때.
  • 구조체나 열거형을 사용할 때, 프로퍼티 값을 효율적으로 변경하고 싶을 때.

9. 결론

mutating 키워드는 구조체와 열거형에서 값 타입의 불변성을 유지하면서도 필요한 경우 값을 수정할 수 있도록 돕는 강력한 도구.

이를 적절히 활용하면 코드의 안정성을 유지하면서도 기능적인 유연성을 확보할 수 있음.

'Swift' 카테고리의 다른 글

[Swift] GCD  (0) 2024.04.13
[Swift] ARC  (0) 2024.04.13
[Swift] inout  (0) 2024.04.08
[Swift] Escaping Closure (@escaping)  (0) 2024.04.05
[Swfit] Value Type, Reference Type (값 타입과 참조 타입)  (0) 2024.04.04