2021.08.11 - [iOS/Swift] - [Swift] Struct Mutating
ㅋㅋㅋㅋㅋㅋㅋㅋ좀 더 알아보고 쓰지 새끼야...
다시 간단히 정리하려고 씁니다..
아니 이전에 쓴 것도 맞긴한데.. 동작 방식에 대해서 추가적으로 쓰려한다.
일단 기본적으로..
구조체의 메소드를 구조체 내부에서 데이터 수정 할 때는 Mutating 키워드를 선언해주어야 한다.
struct Coordinate {
var x: Int = 0
var y: Int = 0
mutating func moveTo(x: Int, y: Int) {
self.x.= x
self.y = y
}
}
let coordinate = Coordinate(x: 2, y: 4)
mutating 키워드를 선언해주지 않는다면, Cannot assign to property: 'self' is immutable이라고 컴파일 에러가 발생한다.
저런 에러가 왜 발생하는가?
Swift의 구조체는 값타입이다.
값타입의 인스턴스 프로퍼티를 변경할 시 원본값을 변경하는 것이 아닌 인스턴스를 복사하여 변경해버리기때문에 프로퍼티를 변경해줘도 소용이 없다 왜? 원본값은 그대로니깐
그래서 저래 에러를 내뱉는 것이다.
그럼 어떻게 해야하는가?
이 때 사용해주는 것이 mutating 키워드이다.
mutating 키워드를 붙여 메서드를 사용하면 해당 메서드가 종료될 때 원본 구조체 인스턴스를 인스턴스 프로퍼티가 변경된 구조체 인스턴스로 대체한다.
하지만 mutating을 사용하여도 프로퍼티를 변경하지 못하는 경우도 있다.
인스턴스가 상수에 할당되어있는 경우인데, 이 경우엔 왜 변경하지 못할까?
먼저 구조체는 스택에 저장된다.
클래스와 달리 구조체는 스택에 원본 인스턴스 자체를 저장해버리고, 이를 상수로 선언해버린다면..
이래 구조체 자체를 잠궈버렸기 때문에 구조체 내부의 프로퍼티 전부를 변경할 수 없게 된 것이다.
구조체 인스턴스를 변수에 할당한다면 문제없이 동작한다. 다만 변경하고 싶은 프로퍼티는 당연히 상수가 아닌 변수여야겠지
읽다보면 "구조체는 클래스와 달리"라는 말을 썼는데 뭐가 다른건지 안알려주면 서운해할까봐 이것도 간단히 말하면..
클래스는 참조 타입이므로 구조체와 지역 변수가 Stack에 같이 올라가는 것과 달리, 지역 변수는 Stack에 올라가되 지역 변수는 클래스 인스턴스가 위치한 Heap의 주소를 갖고있기 때문에 지역 변수를 상수로 선언하여도 인스턴스를 변경하지 못하게 하는 것이 아닌 주소값을 변경하지 못하게 되는 것이다.
그렇기 때문에 클래스 인스턴스를 상수에 할당하여도 클래스 인스턴스 프로퍼티는 변경이 가능한 것이다.
물론 이것도 상수가 아닌 변수일 때만임
간단하게 알아볼랬는데 1시간반 지남;
'iOS > Swift' 카테고리의 다른 글
[Xcode] 단축키 좀 써주세요... (0) | 2022.08.06 |
---|---|
[Swift] defer (0) | 2022.06.10 |
[Swift] Hashable (0) | 2022.05.02 |
[Swift] Increasing Performance by Reducing Dynamic Dispatch (0) | 2022.04.22 |
Swift) COW(Copy On Write) (0) | 2022.02.20 |
댓글