Swift에서 struct
Swift에는 class와 struct으로 객체를 표현합니다. struct은 SwiftUI의 기본이 되기도 하고, 현대 프로그래밍의 개념들에 영향을 많이 받은 단위입니다.
현대 프로그래밍의 개념들이라 하면 흔히 아래와 같은 특징들을 말합니다.
- 최대한 변하지 않게 한다
- 유용한 문법 설탕을 많이 제공한다
- 명시적이다
struct도 비슷하게
- value type이라 주고받을 때 새로운 값을 만들고,
- Computed Property로 개념상으로는 property인데 내부적인 계산을 해야 하는 값을 property처럼 다룰 수 있게 하고,
- 내부 property를 변화시키는 건 명시적으로 mutating을 붙이도록 돼 있습니다.
여기서 3번째 mutating에 대해 자세히 알아 보겠습니다!
struct은 기본적으로 Property를 변경하지 않아야 한다. 하지만 해야 한다면?
평범한 Swift struct를 만들어 보겠습니다.
struct Point {
var x: Int
var y: Int
}
여기에 평범해 보이는 moveHorizontal이라는 함수를 추가해 보겠습니다.
struct Point {
var x: Int
var y: Int
func moveHorizontal(size: Int) {
x += size
}
}
하지만 이 코드는 컴파일 에러가 납니다.
왜냐하면 moveHorizontal이라는 함수는 Point의 instance property를 변경하기 때문에 mutating을 붙여야 합니다. Swift의 struct에서는 모든 property를 변경하는 함수에 mutating을 붙이지 않으면 컴파일 에러가 나게 돼 있습니다.
struct Point {
var x: Int
var y: Int
mutating func moveHorizontal(size: Int) {
x += size
}
}
Swift Compiler는 사실 다 알고 있다
보통 이런 keyword는 컴파일러의 Type Checking에 도움을 주거나, 성능 최적화 때문에 쓰는 경우가 많습니다. 예를 들면 Swift의 @fronzen이나 final, Kotlin의 tailrec은 모두 성능 최적화에 쓰입니다.
하지만 mutating은 그렇지 않습니다. 사실 Compiler는 특정 함수가 mutating 함수인지 아닌지 아주 잘 알고 있습니다. 그렇지 않다면 mutating인 함수에 mutating을 쓰지 않았을 때 바로 잘 알려 줄 수가 없겠죠? mutating은 컴파일러가 아닌 프로그래머를 위해 있다고 합니다. 특정 함수가 mutating 함수인지 그렇지 않은 함수인지 직접 지정해 줘야 하면...
- 함수를 정의할 때 이게 mutating이어야 할까 다시 1번 생각해 보게 됨
- 함수를 쓸 때 부수효과에 대해 1번 더 생각해 보게 됨
이런 효과가 있기 때문에 mutating이 있습니다!
'👨💻 프로그래밍 > 🍎 iOS 개발' 카테고리의 다른 글
🍎 Tipkit을 사용해서 앱의 숨겨진 기능을 유저에게 넛지 주기 (0) | 2024.09.23 |
---|---|
🍎 Stanford iOS 강의 (CS193P) 수강 후기 (0) | 2024.09.14 |
🍎 Swift Testing: 보기 싫은 XCTest는 이제 안녕!! (0) | 2024.08.15 |
🍎 Swift Package에서 Localization 처리하기 (0) | 2024.08.10 |
🍎 나만의 Swift Package 만들기! - 개인 프로젝트에서 중복되는 코드 없애기 (0) | 2024.08.08 |