Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
397 changes: 397 additions & 0 deletions Fine/250616_Method.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,397 @@
* μ–΄λ–€ λ™μž‘μ„ μ‹€ν–‰ν•˜λŠ” μ½”λ“œμ˜ 묢음
* func ν‚€μ›Œλ“œλ‘œ λ§Œλ“¦ => νŠΉμ • νƒ€μž…(struct, class, enumκ³Ό 같은 μžλ£Œν˜•)에 μ†Œμ†λœ ν•¨μˆ˜

# ν•¨μˆ˜μ™€μ˜ ꡬ뢄
* ν•¨μˆ˜(Function): 아무 λ°λ‚˜ 자유둭게 μ‚¬μš©κ°€λŠ₯ (μ „μ—­ν•¨μˆ˜)
* λ©”μ„œλ“œ(Method): νŠΉμ • νƒ€μž…μ— μ†Œμ†λœ ν•¨μˆ˜

## μ •λ¦¬ν‘œ

| **ꡬ뢄** | **μ •μ˜ μœ„μΉ˜** | **λΆ€λ₯΄λŠ” 방법** | **μ˜ˆμ‹œ μ½”λ“œ** |
| ------ | -------------- | ---------- | ---------------------------- |
| ν•¨μˆ˜ | μ•„λ¬΄λ°λ‚˜ κ°€λŠ₯ | 이름() | greet(name: "민수") |
| λ©”μ„œλ“œ | νƒ€μž…(struct λ“±) μ•ˆ | νƒ€μž….이름() | person.greet() (person은 ꡬ쑰체) |

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ ν•¨μˆ˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β–²
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ β”‚
μ „μ—­ ν•¨μˆ˜ λ©”μ„œλ“œ (= νƒ€μž… μ•ˆμ— 있음)
β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ β”‚ β”‚
struct class enum

예) ν•¨μˆ˜
```swift
func greet(name: String) {
print("μ•ˆλ…•, \(name)!")
}
```

예) λ©”μ„œλ“œ
```swift
struct Person {
var name: String

// 이건 λ©”μ„œλ“œμ˜ˆμš”!
func greet() {
print("μ•ˆλ…•, λ‚˜λŠ” \(name)이야!")
}
}
```
* personμ΄λΌλŠ” νƒ€μž…(ꡬ쑰체) μ•ˆμ— 있음.
* personμ΄λΌλŠ” μžλ£Œν˜•μ— μ†Œμ†λœ ν•¨μˆ˜ => λ©”μ„œλ“œ

# λ©”μ„œλ“œκ°€ ν•„μš”ν•œ 이유
* νƒ€μž…μ— 행동을 뢙일 수 있기 λ•Œλ¬Έμ— => μ–΄λ–€ 데이터가 'ν•  수 μžˆλŠ” λ™μž‘'을 ν•¨κ»˜ 묢어두면 훨씬 직관적이고 κΉ”λ”ν•˜λ©° μž¬μ‚¬μš©μ΄ μ‰¬μ›Œμ§€κΈ° λ•Œλ¬Έ.
예) κ°•μ•„μ§€.run(), μ‚¬λžŒ.sayHello(), 계산기.add()

# μ–Έμ œ μ‚¬μš©ν•˜λ‚˜?
* λ²„νŠΌμ„ λˆ„λ₯Ό λ•Œ - ν΄λ¦­ν•˜λ©΄ μ–΄λ–€ λ™μž‘μ„ ν•˜λ„λ‘ λ§Œλ“€κΈ° μœ„ν•΄
* μ• λ‹ˆλ©”μ΄μ…˜ 쀄 λ•Œ - κ°’ λ°”κΎΈκ³  μ• λ‹ˆλ©”μ΄μ…˜λ„ 같이 μ‹€ν–‰ν•˜κΈ° μœ„ν•΄
* κ°’ 계산할 λ•Œ - λ˜‘κ°™μ€ 계산을 λ°˜λ³΅ν•˜μ§€ μ•Šκ³  μž¬μ‚¬μš©ν•˜κΈ° μœ„ν•΄
* λ·° μ—…λ°μ΄νŠΈ - 값이 λ°”λ€Œλ©΄ 화면도 λ°”λ€Œκ²Œ μ—°κ²°ν•  수 있음.
# Method κΈ°λ³Έ 문법
1. μ •μ˜ν•˜κΈ° (func둜 μ„ μ–Έ)
```swift
func Method이름(λ§€κ°œλ³€μˆ˜: νƒ€μž…)-> λ¦¬ν„΄νƒ€μž… {
// μ‹€ν–‰ν•  μ½”λ“œ
}
```
2. ν˜ΈμΆœν•˜κΈ° (ν•„μš”ν•œ λ•Œ μ‚¬μš©)

Method이름(λ§€κ°œλ³€μˆ˜)

| **μš”μ†Œ** | **μ„€λͺ…** |
| ---------- | ------------------------ |
| func | λ©”μ„œλ“œλ₯Ό λ§Œλ“€ λ•Œ μ‚¬μš©ν•˜λŠ” ν‚€μ›Œλ“œ |
| 이름 | λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ μ‚¬μš©ν•˜λŠ” 이름 |
| λ§€κ°œλ³€μˆ˜ | λ©”μ„œλ“œκ°€ μž‘μ—…ν•  λ•Œ ν•„μš”ν•œ κ°’ (없어도 됨) |
| λ°˜ν™˜(return) | λ©”μ„œλ“œκ°€ κ³„μ‚°ν•˜κ³  λŒλ €μ£ΌλŠ” κ²°κ³Ό κ°’ (선택) |

예1) 기본 ꡬ쑰
```swift
func sayHello() {
print("μ•ˆλ…•!")
}
```

예2) λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” Method
```swift
struct ContentView: View {
Β  Β  // λ©”μ„œλ“œ μ •μ˜: 이름을 λ°›μ•„ 인사 좜λ ₯
Β  Β  func greet(name: String) {
Β  Β  Β  Β  print("μ•ˆλ…•, \(name)!")
Β  Β  }

Β  Β  // ν™”λ©΄ κ·Έλ¦¬λŠ” λΆ€λΆ„
Β  Β  var body: some View {
Β  Β  Β  Β  VStack(spacing: 20) {
Β  Β  Β  Β  Β  Β  Button("Say Hello") {
Β  Β  Β  Β  Β  Β  Β  Β  greet(name: "μ§€λ―Ό") // μ½˜μ†”μ— "μ•ˆλ…•, μ§€λ―Ό!" 좜λ ₯됨
Β  Β  Β  Β  Β  Β  }
Β  Β  Β  Β  }
Β  Β  Β  Β  .padding()
Β  Β  }
}
```

예3) 값을 λŒλ €μ£ΌλŠ”(return) Method
```swift
struct ContentView: View {
Β func add(a: Int, b: Int) -> Int {
Β Β  Β  return a + b
Β }

Β  Β  // ν™”λ©΄ κ·Έλ¦¬λŠ” λΆ€λΆ„
Β  Β  var body: some View {
Β  Β  Β  Β  VStack(spacing: 20) {
Β  Β  Β  Β  Β  Β  Button("Add Numbers") {
Β Β  Β  Β  Β  Β  Β  let result = add(a: 3, b: 5)
Β Β  Β  Β  Β  Β  Β  print("κ²°κ³ΌλŠ” \(result)μž…λ‹ˆλ‹€.")// μ½˜μ†”μ— "κ²°κ³ΌλŠ” 8μž…λ‹ˆλ‹€." 좜λ ₯됨
Β  Β  Β  Β  Β  Β  }
Β  Β  Β  Β  }
Β  Β  Β  Β  .padding()
Β  Β  }
}
```

예4) swiftUI λ·° μ•ˆμ—μ„œ Method μ‚¬μš©
λ²„νŠΌμ„ λˆŒλŸ¬μ„œ 점수λ₯Ό μ˜¬λ¦¬λŠ” λ©”μ„œλ“œ
```swift
struct ScoreView: View {
@State private var score = 0

func increaseScore() {
score += 1
}

var body: some View {
VStack {
Text("점수: \(score)")
Button("점수 올리기", action: increaseScore)
}
}
}
```
---
**Q.** λ©”μ„œλ“œλŠ” κΌ­ λ·°(struct) μ•ˆμ— μžˆμ–΄μ•Ό ν•˜λ‚˜μš”?
A. μ•„λ‹ˆμš”. struct, class, λ˜λŠ” 자유둭게 ν•¨μˆ˜μ²˜λŸΌ **μ „μ—­μ—μ„œλ„ λ§Œλ“€ 수 μžˆμ–΄μš”.**
일반 계산, λ‚ μ§œ ν¬λ§·νŒ… 등은 μ™ΈλΆ€ ν•¨μˆ˜λ‘œ 빼도 λ©λ‹ˆλ‹€.
λ‹€λ§Œ SwiftUIμ—μ„œ **뷰와 μ—°κ²°λœ λ™μž‘μ΄λΌλ©΄**, λ·° μ•ˆμ— λ„£λŠ” 게 μ’‹μ•„μš”.

**Q.** λ©”μ„œλ“œ 이름은 μ•„λ¬΄λ ‡κ²Œλ‚˜ 지어도 λΌμš”?
A. 숫자둜 μ‹œμž‘ν•˜κ±°λ‚˜ 곡백이 λ“€μ–΄κ°€λ©΄ μ•ˆ 되고,
Swift μ˜ˆμ•½μ–΄λŠ” ν”Όν•΄μ•Ό ν•΄μš”. 보톡 μ†Œλ¬Έμžλ‘œ μ‹œμž‘ν•˜κ³  동사 ν˜•νƒœλ‘œ μ§“λŠ” 게 μ’‹μ•„μš”.

**Q.** λ©”μ„œλ“œ μ•ˆμ—μ„œ λ‹€λ₯Έ λ©”μ„œλ“œλ₯Ό λΆ€λ₯Ό 수 μžˆμ–΄μš”?
A. λ‹Ήμ—°ν•΄μš”! λ©”μ„œλ“œλΌλ¦¬ μ„œλ‘œ ν˜ΈμΆœν•˜λ©° 큰 λ™μž‘μ„ λ‚˜λˆŒ 수 μžˆμ–΄μš”.

---
# **βœ… Swiftμ—μ„œ λ©”μ„œλ“œμ™€ λΉ„μŠ·ν•œ 역할을 ν•˜λŠ” 것듀**

| **μ’…λ₯˜** | **μ„€λͺ…** |
| --------------------------------- | ------------------------------- |
| βœ… ν•¨μˆ˜ (Function) | λ©”μ„œλ“œμ™€ 거의 같은 κ°œλ…. κ΅¬μ‘°μ²΄λ‚˜ 클래슀 λ°–μ—μ„œ μ •μ˜λ¨ |
| βœ… ν΄λ‘œμ € (Closure) | 이름 μ—†λŠ” ν•¨μˆ˜μ²˜λŸΌ μ‚¬μš©λ˜λŠ” μ½”λ“œ 덩어리 |
| βœ… μ»΄ν“¨ν‹°λ“œ ν”„λ‘œνΌν‹° (Computed Property) | 값을 μ €μž₯ν•˜μ§€ μ•Šκ³  κ³„μ‚°ν•΄μ„œ λŒλ €μ£ΌλŠ” 속성 |
| βœ… μ„œλΈŒμŠ€ν¬λ¦½νŠΈ (Subscript) | λ°°μ—΄μ²˜λŸΌ λŒ€κ΄„ν˜Έλ‘œ 값을 κΊΌλ‚Ό 수 있게 λ§Œλ“œλŠ” κΈ°λŠ₯ |
| βœ… μ—°μ‚°μž μ˜€λ²„λ‘œλ”© (Operator Overloading) | +, *, == λ“± μ—°μ‚°μžμ— λ™μž‘μ„ 직접 μ •μ˜ν•¨ |

**1️⃣ ν•¨μˆ˜ (Function) – λ©”μ„œλ“œλž‘ 거의 κ°™μŒ**
```swift
func add(a: Int, b: Int) -> Int {
return a + b
}
let result = add(a: 3, b: 4) // result = 7
```

- ν•¨μˆ˜λŠ” **ν΄λž˜μŠ€λ‚˜ ꡬ쑰체 μ•ˆμ— 없어도** μ •μ˜ κ°€λŠ₯
- λ©”μ„œλ“œλŠ” νŠΉμ • νƒ€μž…μ— λ¬Άμ—¬ μžˆλŠ” ν•¨μˆ˜

**2️⃣ ν΄λ‘œμ € (Closure) – 이름 μ—†λŠ” μž‘μ€ ν•¨μˆ˜**
```swift
let sayHi = {
print("μ•ˆλ…•!")
}
sayHi() // ν΄λ‘œμ € 싀행됨
```

- ν•¨μˆ˜μ²˜λŸΌ μž‘λ™ν•˜μ§€λ§Œ **이름이 μ—†κ±°λ‚˜ λ³€μˆ˜μ— μ €μž₯ κ°€λŠ₯**
- func 없이 μ€‘κ΄„ν˜Έ{} 만으둜 λ§Œλ“€μ–΄μ§. - { print("μ•ˆλ…•!") }
- λ³€μˆ˜λ‚˜ μƒμˆ˜μ— λ‹΄μ•„μ„œ μ €μž₯ κ°€λŠ₯. - sayHiλΌλŠ” μƒμˆ˜μ— μ €μž₯됨.
- μƒμˆ˜μ— ()λ₯Ό 뢙이면 ν΄λ‘œμ €κ°€ 싀행됨. - sayHi()
- SwiftUI의 .onTapGesture { ... }, .sheet { ... } 도 μ „λΆ€ ν΄λ‘œμ €
- μ™œ μ‚¬μš©? - 짧게 μ“Έ 수 있고, λ‹€λ₯Έ ν•¨μˆ˜μ— 전달할 수 μžˆμ–΄μ„œ μœ μ—°ν•œ κΈ°λŠ₯ μž‘μ„±μ— μ’‹μŒ.
- μ–Έμ œ μ‚¬μš©? - SwiftUI, μ• λ‹ˆλ©”μ΄μ…˜, λ²„νŠΌ λ™μž‘μ— 자주 μ‚¬μš©.

**ν΄λ‘œμ € vs ν•¨μˆ˜ 차이 정리**
| **ꡬ뢄** | **ν•¨μˆ˜ (Function)** | **ν΄λ‘œμ € (Closure)** |
| ------ | ----------------- | ---------------------- |
| μ •μ˜ 방식 | func ν‚€μ›Œλ“œ μ‚¬μš© | { } μ€‘κ΄„ν˜Έλ§Œ μ‚¬μš© |
| 이름 | ν•„μˆ˜ | 없어도 됨 (보톡 λ³€μˆ˜μ— μ €μž₯함) |
| μ €μž₯ | ν•¨μˆ˜λŠ” 직접 μ‹€ν–‰ν•˜κ±°λ‚˜ 전달 | ν΄λ‘œμ €λŠ” λ³€μˆ˜/μƒμˆ˜μ— μ €μž₯ν•΄ μž¬μ‚¬μš© κ°€λŠ₯ |

**3️⃣ μ»΄ν“¨ν‹°λ“œ ν”„λ‘œνΌν‹° (Computed Property) – 읽을 λ•Œλ§ˆλ‹€ κ³„μ‚°ν•˜λŠ” 속성**
Β ```swift
Β struct Circle {
Β  var radius: Double
Β  var area: Double {
Β Β  return radius * radius * 3.14
Β  }
Β }

Β var body: some View {
Β  let c = Circle(radius: 10)

Β  VStack(spacing: 20) {
Β Β  Text("넓이: \(c.area)")Β  // "넓이: 314.0" () 없이 μ‚¬μš© - λ©”μ„œλ“œμ™€ λ‹€λ₯Έ 점.
Β  }
Β  .padding()
Β }
}
```
- areaλŠ” Computed property - 값을 μ €μž₯ν•΄ 두지 μ•Šκ³  ν•„μš”ν•  λ•Œλ§ˆλ‹€ κ³„μ‚°ν•΄μ„œ μ•Œλ €μ€Œ.
- λ©”μ„œλ“œμ²˜λŸΌ 계산 κ²°κ³Όλ₯Ό μ£Όμ§€λ§Œ **μ†μ„±μ²˜λŸΌ μ‚¬μš©**됨 (κ°’μ²˜λŸΌ . μ°μ–΄μ„œ 씀)

|**이름** |**μ €μž₯함?**|**맀번 계산함?**|**μ‚¬μš©ν•˜λŠ” 법** | 예
|μ €μž₯ 속성|βœ… |❌ |circle.radius | 쒅이에 '10'이라고 숫자λ₯Ό 써놓은 것
|계산 속성|❌ |βœ… |circle.area | 쒅이에 '10'이라고 μ“°μ—¬μžˆλŠ” κ±Έ 보고 맀번 계산기 λ‘λ‘λ €μ„œ "314.0"을 λ³΄μ—¬μ£ΌλŠ” 것
|λ©”μ„œλ“œ |❌ |βœ… |circle.getArea()| "계산기 μΌœμ„œ 직접 λˆŒλŸ¬μ£Όμ„Έμš”."

**Q.** 계산 속성은 항상 κ³„μ‚°ν•΄μš”? λŠλ €μ§€μ§„ μ•Šλ‚˜μš”?
A. λ„€, 맀번 κ³„μ‚°ν•΄μš”. κ°€λ²Όμš΄ 계산은 문제 μ—†μ§€λ§Œ, 무거운 계산은 lazy varλ‚˜ μ €μž₯ μ†μ„±μœΌλ‘œ λ°”κΎΈλŠ” 게 λ‚˜μ„ 수 μžˆμ–΄μš”.

**Q.** 계산 속성에도 set을 μ“Έ 수 μžˆλ‚˜μš”?
A. λ„€! getκ³Ό set을 ν•¨κ»˜ μ¨μ„œ 읽고 μ“Έ 수 μžˆλŠ” 계산 속성도 λ§Œλ“€ 수 μžˆμ–΄μš”.
```swift
var area: Double {
get { ... }
set { ... }
}
```

**Q.** λ©”μ„œλ“œλ‘œ 해도 λ˜λŠ”λ° 계산 속성을 μ“°λŠ” μ΄μœ λŠ”?
A. μ†μ„±μ²˜λŸΌ 보이게 ν•˜λ©΄ **μ½”λ“œκ°€ μžμ—°μŠ€λŸ½κ³  읽기 μ‰¬μ›Œμ Έμš”.**
μ‚¬λžŒμ΄ 읽을 λ•Œ **κ°’μ²˜λŸΌ λ³΄μ΄μ§€λ§Œ, 사싀 κ³„μ‚°λΌμ„œ λ˜‘λ˜‘ν•œ μ½”λ“œκ°€ λ˜λŠ” κ±°μ£ .**

**4️⃣ μ„œλΈŒμŠ€ν¬λ¦½νŠΈ (Subscript) – λ°°μ—΄μ²˜λŸΌ λ™μž‘ν•˜κ²Œ λ§Œλ“€κΈ°**
```swift
struct WordList {
let words = ["apple", "banana", "cherry"]

subscript(index: Int) -> String {
return words[index]
}
}

Β var body: some View {
Β Β  Β  let list = WordList()
Β Β  Β  let secondWord = list[1] // "banana"

Β Β  Β  VStack(spacing: 20) {
Β Β  Β  Β  Β  Text("두 번째 λ‹¨μ–΄λŠ”:")
Β Β  Β  Β  Β  Text(secondWord)
Β Β  Β  Β  Β  Β  Β  .font(.title)
Β Β  Β  Β  Β  Β  Β  .foregroundColor(.purple)
Β Β  Β  }
Β Β  Β  .padding()
Β }
}
```
- λ©”μ„œλ“œμ²˜λŸΌ λ‚΄λΆ€ λ‘œμ§μ„ κ°–κ³  μžˆμ§€λ§Œ,
- **λ°°μ—΄μ²˜λŸΌ 쓰이도둝 λ§Œλ“  ν•¨μˆ˜**
- μœ„μ˜ μ˜ˆμ—μ„œ wordsλŠ” λ°°μ—΄μ΄μ§€λ§Œ, WordListλŠ” 배열이 μ•„λ‹˜. => WordList()[0] => μ—λŸ¬λ‚¨.
- subscriptλ₯Ό μ¨μ„œ WordListκ°€ λ°°μ—΄μ²˜λŸΌ λ™μž‘ν•¨.

**5️⃣ μ—°μ‚°μž μ˜€λ²„λ‘œλ”© – μ—°μ‚°μžλ₯Ό ν•¨μˆ˜μ²˜λŸΌ μ •μ˜ν•˜κΈ°**
Β ```swift
Β struct Point {
Β Β  Β  var x: Int
Β Β  Β  var y: Int

Β Β  Β  // + μ—°μ‚°μž μ˜€λ²„λ‘œλ”©: 두 Pointλ₯Ό 더할 수 있게 λ§Œλ“¦
Β Β  Β  static func + (a: Point, b: Point) -> Point {
Β Β  Β  Β  Β  return Point(x: a.x + b.x, y: a.y + b.y)
Β Β  Β  }
Β }

Β struct ContentView: View {
Β Β  Β  var body: some View {
Β Β  Β  Β  Β  let p1 = Point(x: 1, y: 2)
Β Β  Β  Β  Β  let p2 = Point(x: 3, y: 4)
Β Β  Β  Β  Β  let p3 = p1 + p2Β  // Point(x: 4, y: 6)

Β Β  Β  Β  Β  return VStack(spacing: 20) {
Β Β  Β  Β  Β  Β  Β  Text("p1: (\(p1.x), \(p1.y))")
Β Β  Β  Β  Β  Β  Β  Text("p2: (\(p2.x), \(p2.y))")
Β Β  Β  Β  Β  Β  Β  Text("p1 + p2 = (\(p3.x), \(p3.y))")
Β Β  Β  Β  Β  }
Β Β  Β  Β  Β  .padding()
Β Β  Β  }
Β }
Β ```

- + κΈ°ν˜ΈλŠ” 사싀 λ©”μ„œλ“œμ²˜λŸΌ μž‘λ™ν•¨.
- μ›λž˜ +λŠ” 숫자끼리만 더할 수 μžˆμ§€λ§Œ, μ΄λ ‡κ²Œ μ •μ˜ν•˜λ©΄ Point끼리도 + 연산이 κ°€λŠ₯함. μ’Œν‘œλ₯Ό λ”ν•΄μ„œ μƒˆλ‘œμš΄ μ’Œν‘œλ₯Ό λ§Œλ“€λ„λ‘ ν•œ 것.
- κ°œλ°œμžκ°€ 직접 κΈ°λŠ₯을 μ •μ˜ν•  수 있음.

|**κ°œλ…** |**μ„€λͺ…**
|Point ꡬ쑰체 |μ’Œν‘œ (x, y)λ₯Ό λ‚˜νƒ€λƒ„
|static func +|두 Pointλ₯Ό 더할 수 μžˆλ„λ‘ + μ—°μ‚°μž λ™μž‘ μ •μ˜
|p1 + p2 |각각의 x, y 값을 λ”ν•΄μ„œ μƒˆ Point 생성
|ν™”λ©΄ 좜λ ₯ |κ²°κ³Όλ₯Ό Text둜 ν‘œν˜„ν•΄μ„œ SwiftUI ν™”λ©΄μ—μ„œ 확인 κ°€λŠ₯

**Q** static이 μ™œ λΆ™μ—ˆμ–΄μš”?
A. μ—°μ‚°μž μ˜€λ²„λ‘œλ”©μ€ νƒ€μž… 전체에 λŒ€ν•œ λ™μž‘μ΄λΌμ„œ static이 ν•„μš”ν•΄μš”.
(μΈμŠ€ν„΄μŠ€ ν•˜λ‚˜κ°€ μ•„λ‹Œ Point νƒ€μž…λΌλ¦¬ λ”ν•˜λŠ” κ±°λ‹ˆκΉŒμš”.)

**Q.** -, * 같은 λ‹€λ₯Έ μ—°μ‚°μžλ„ μ˜€λ²„λ‘œλ”©ν•  수 μžˆμ–΄μš”?
A. 물둠이죠! static func - (...) -> Point 도 λ§Œλ“€ 수 μžˆμ–΄μš”.

**Q.** Swiftκ°€ μ™œ μ΄λ ‡κ²Œ μ—°μ‚°μžκΉŒμ§€ λ§Œλ“€ 수 있게 ν•΄λ†¨μ–΄μš”?
A. 숫자뿐만 μ•„λ‹ˆλΌ κ΅¬μ‘°μ²΄λ‚˜ 벑터, μ’Œν‘œ, 돈, 색상 λ“± **μžμ—°μŠ€λŸ½κ²Œ λ”ν•˜κ³  λΉΌκ³  비ꡐ**ν•  수 있게 ν•˜λ €κ³ μš”.

---
# isMultiple(of: )

**Q.** isMultiple(of: ) κ³Ό λΉ„μŠ·ν•œ μ—°μ‚° λ©”μ†Œλ“œκ°€ 뭐가 μžˆλ‚˜μš”?
A. Swift의 BinaryInteger ν”„λ‘œν† μ½œμ—μ„œ μ œκ³΅ν•˜λŠ” μˆ«μžλ‚˜ μ»¬λ ‰μ…˜ 등에 μ‚¬μš©λ˜λŠ” 의미 기반의 μ—°μ‚° λ©”μ„œλ“œ

βœ… μˆ«μžμ™€ κ΄€λ ¨λœ μ—°μ‚° λ©”μ„œλ“œλ“€

1. isMultiple(of:)
β€’ μ–΄λ–€ μˆ˜κ°€ νŠΉμ • 수의 λ°°μˆ˜μΈμ§€ 확인
`10.isMultiple(of: 5) // true`

2. truncatingRemainder(dividingBy:)
β€’ μ‹€μˆ˜(FloatingPoint)μ—μ„œ λ‚˜λ¨Έμ§€λ₯Ό ꡬ할 λ•Œ
`8.5.truncatingRemainder(dividingBy: 3.0) // 2.5`

3. quotientAndRemainder(dividingBy:)
β€’ λͺ«κ³Ό λ‚˜λ¨Έμ§€λ₯Ό ν•œκΊΌλ²ˆμ— νŠœν”Œλ‘œ λ°˜ν™˜
```swift
let result = 10.quotientAndRemainder(dividingBy: 3)
// result.quotient == 3, result.remainder == 1
```

4. advanced(by:)
β€’ νŠΉμ • κ°’λ§ŒνΌ λ”ν•œ 값을 λ°˜ν™˜ (Index, Int, Date λ“±)
`5.advanced(by: 3) // 8`

5. distance(to:)
β€’ 두 수(ν˜Ήμ€ Index λ“±)의 거리 계산
`5.distance(to: 10) // 5`

βœ… μ»¬λ ‰μ…˜ κ΄€λ ¨ μ—°μ‚° λ©”μ„œλ“œ

6. contains(_:)
β€’ νŠΉμ • μš”μ†Œκ°€ μžˆλŠ”μ§€ 검사
`[1, 2, 3].contains(2) // true`

7. firstIndex(of:), lastIndex(of:)
β€’ νŠΉμ • μš”μ†Œμ˜ 인덱슀λ₯Ό λ°˜ν™˜
`["a", "b", "c"].firstIndex(of: "b") // 1`

8. starts(with:), ends(with:)
β€’ νŠΉμ • νŒ¨ν„΄μœΌλ‘œ μ‹œμž‘ν•˜κ±°λ‚˜ λλ‚˜λŠ”μ§€
`[1, 2, 3].starts(with: [1, 2]) // true`

βœ… λ¬Έμžμ—΄ κ΄€λ ¨

9. hasPrefix(_:), hasSuffix(_:)
β€’ λ¬Έμžμ—΄μ΄ νŠΉμ • μ ‘λ‘μ–΄λ‚˜ μ ‘λ―Έμ–΄λ₯Ό κ°–λŠ”μ§€
`"SwiftUI".hasPrefix("Swift") // true`

10. localizedStandardContains(_:)
β€’ λŒ€μ†Œλ¬Έμž ꡬ뢄 없이 포함 μ—¬λΆ€ 검색
`"Hello World".localizedStandardContains("world") // true`

βœ… 비ꡐ 및 νŒλ³„ κ΄€λ ¨

11. clamped(to:)
β€’ λ²”μœ„ λ‚΄λ‘œ 값을 μ œν•œ
`let value = 15.clamped(to: 0...10) // 10`

12. signum()
β€’ 수의 λΆ€ν˜Έλ₯Ό λ°˜ν™˜ (-1, 0, 1 쀑 ν•˜λ‚˜)
`(-5).signum() // -1`

---
Q. isMultiple(of:)은 λΆ€λ™μ†Œμˆ˜μ (Float, Double)에도 μ‚¬μš©ν•  수 μžˆμ–΄μš”?
A. μ•„λ‹ˆμš”. isMultiple(of:)λŠ” BinaryInteger νƒ€μž…(Int λ“±) μ „μš©μ΄μ—μš”. μ‹€μˆ˜μ—λŠ” truncatingRemainder(dividingBy:)λ₯Ό μ‚¬μš©ν•˜μ„Έμš”.

---
isMultiple(of: )둜 짝수, ν™€μˆ˜ νŒλ³„μ‹μ„ λ§Œλ“€ 수 있음.
```swift
extension Int {
var isEven: Bool { self.isMultiple(of: 2) }
var isOdd: Bool { !isEven }
}
```

isMultiple(of:)이 %보닀 λ‚˜μ€ 경우:
가독성과 μ •ν™•μ„±. isMultiple(of:)λŠ” λͺ…ν™•ν•œ μ˜λ„λ₯Ό μ „λ‹¬ν•˜κ³ , 음수 μ²˜λ¦¬λ„ 직관적.
Loading