Swift에서 구조체와 열거형을 사용하다 보면 mutating
이라는 키워드를 종종 마주치게 됩니다. 처음 접할 때는 조금 헷갈릴 수 있는데, 이 글에서는 mutating
의 필요성과 함께 Swift의 값 타입에 대한 개념도 함께 정리해보겠습니다.
mutating
이란?
mutating
키워드는 Swift의 구조체나 열거형 내의 메서드에서 사용되며, 해당 메서드가 자기 자신의 프로퍼티나 값을 변경할 수 있음을 나타냅니다.
struct Counter {
var count: Int = 0
mutating func increment() {
count += 1
}
}
이 구조체의 increment
메서드에 mutating
키워드가 있기 때문에 count
값을 변경할 수 있습니다.
값 타입이란?
Swift에는 크게 값 타입(value type)과 참조 타입(reference type) 두 가지의 데이터 타입이 있습니다.
- 값 타입: 데이터의 복사본을 전달하거나 할당할 때 실제 값이 복사됩니다. 주로 구조체(
struct
)와 열거형(enum
)이 여기에 속합니다. - 참조 타입: 데이터의 복사본을 전달하거나 할당할 때 실제 데이터의 주소(참조)가 전달됩니다. 주로 클래스(
class
)가 여기에 속합니다.
이 두 타입의 가장 큰 차이는 '복사'와 '참조' 방식에 있습니다.
mutating
의 필요성과 값 타입
값 타입에서는 인스턴스 자체가 메모리에 고정된 값으로 존재하기 때문에, 그 값을 변경하려면 새로운 인스턴스를 생성하게 됩니다. 즉, 메서드 내에서 인스턴스의 프로퍼티나 값 자체를 변경할 수 없습니다. 하지만 mutating
키워드를 사용하면 이를 가능하게 해줍니다.
클래스와 달리 구조체와 열거형은 메서드 내에서 프로퍼티를 변경하려면 mutating
키워드가 필요합니다. 왜냐하면, 값 타입은 기본적으로 불변성을 지니기 때문입니다.
예시로 이해하기
struct Point {
var x: Int, y: Int
mutating func moveByX(_ deltaX: Int, y deltaY: Int) {
x += deltaX
y += deltaY
}
}
var myPoint = Point(x: 1, y: 1)
var myPoint2 = myPoint
myPoint.moveByX(2, y: 3)
print(myPoint) // 출력: Point(x: 3, y: 4)
print(myPoint2) // 출력: Point(x: 1, y: 1)
moveByX
메서드에 mutating
키워드가 없으면 x
와 y
값을 수정할 수 없습니다.
또한 myPoint2
는 값이 복사된 상태이기 때문에 moveByX
를 호출하기 전과 동일한 값을 보여줍니다.
만약 이것이 클래스였다면, 서로 참조하는 방식이었을 테니 같은 값을 갖게 되었을 것입니다.
이것으로 mutating 키워드에 대해 알아보았습니다. 이번 포스트가 여러분들에게 도움이 되었길 바라며, 언제든지 질문이 있으시다면 댓글로 남겨주세요. 다음 포스트에서 뵙겠습니다. 감사합니다!
'Swift' 카테고리의 다른 글
[Swift] iOS FontParser 경고 원인과 해결법 (SDK에 폰트 포함된 경우) (1) | 2025.05.01 |
---|---|
[Swift] 클로저의 캡처리스트('[]') (0) | 2023.10.31 |
[Swift] 클로저와 NotificationCenter를 활용한 상태 변화 알리기(View Controller 간의 상호작용) (0) | 2023.07.31 |
[Swift] 'textView(_:shouldChangeTextIn:replacementText:)' 메서드 두 번 호출 버그 (0) | 2023.07.25 |
[Swift] 메모리 관리: 미소유 참조(Unowned References) (0) | 2023.07.21 |