J
[Swift] mutating 본문
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 |