Open vichye-1 opened 11 months ago
struct
, enum
과 같은 value Typs는 기본적으로 내부에서 인스턴스 메서드를 통해 내부 값을 수정할 수 없습니다.struct
, enum
에서 self
키워드를 사용하여 instance property 를 호출시 해당 property는immutable
(불변) 값이 되기에 변경이 불가능 하다.struct
custom initializer에서는 mutable
(가변) 값을 띄우고 있다. 이유는 초기화 시점부터 불변값을 띄우면 초기화를 불가능 하기 때문인 것 같다.struct Jenny {
var age: Int
var name: String
let job: String
init(age: Int, name: String, job: String) {
self.age = age
self.name = name
self.job = job
}
// Error: Left side of mutating operator isn't mutable: 'self' is immutable
func changeAge() {
self.age += 1
}
mutating func changeAge() {
self.age += 1
}
mutating func AllChange(age changeAge: Int, name changeName: String, job changeJob: String) {
self = Jenny(age: age + changeAge, name: changeName, job: changeJob)
}
// Error: Left side of mutating operator isn't mutable: 'job' is a 'let' constant
mutating func changeJob() {
self.job += "바리스타"
}
}
var human: Jenny = Jenny(age: 21, name: "Dohyun", job: "바리스타")
human.AllChange(age: 4, name: "Jun", job: "프로그래머")
mutating
키워드를 사용하여 immutable
값을 mutable
값으로 변경시켜 instance Property 값을 변경 시킬 수 있다.self
를 통해 새로운 인스턴스 할당하는 방법도 있다.let
키워드를 사용하여 immutable
r값을 지정할 경우 mutating
메서드를 사용하더라도 값을 변경할 수 없지만 self
를 통해 새로운 인스턴스를 할당하면 오류가 나지 않는다.struct Bread {
var name: String
mutating func makeBread() {
name = "IDK"
}
}
var bread = Bread(name: "sikbbang")
bread.makeBread()
self를 통해 새로운 인스턴스를 할당할 수 있음
struct Bread {
var sugar: Double = 0.0
mutating func changeSugar(to sugar: Double) {
self.sugar += sugar
}
}
var sikbbang = Bread(sugar: 33.3) sikbbang.changeSugar(to: 10.7) print(sikbbang) //Bread(sugar: 44.0)
### 참조
- [[Swift] mutating 키워드](https://velog.io/@parkgyurim/Swift-Mutating)
- [Swift : 기초문법 [메서드 #2 mutating]](https://seons-dev.tistory.com/entry/Swift-%EA%B8%B0%EC%B4%88%EB%AC%B8%EB%B2%95-%EB%A9%94%EC%84%9C%EB%93%9C-2-mutating)
값 타입인 struct, enum 타입의 메서드 내에서 프로퍼티의 값을 변경할 수 있도록 해주는 키워드이다.
struct {
var property: Int
...
func change() {
self.property = 10 // 에러
}
mutating func changeMutating() {
self.property = 10 // 성공
}
}
Value Type 과 Reference Type의 Copy 차이
Value Type
: 데이터의 새로운 복사본을 생성 (깊은 복사Deep Copy
)COW(Copy On Write)
를 사용하여 Value Type의 복사본에서 값 변경이 이루어졌을 때야 비로소 새로운 메모리 공간을 만들어 값을 저장한다.Reference Type
: 원본 데이터의 주소를 참조 ( 얕은 복사Shallow Copy
)mutating 키워드
Value Type(struct, enum)
은 기본적으로 인스턴스 메서드 내에서 내부 값(프로퍼티들)을 변경할 수 없다.사용예
mutating 키워드 이용
let
으로 선언된 프로퍼티는mutating
키워드를 사용해도 값이 변경되지 않는다.참고