๐ ๋ชฉ์ฐจ
- ๊ฐ์
- ์ ์ฒด ์ฝ๋ ๊ตฌ์กฐ ์ค๋ช
- ViewController.swift ๋ถ์
- BMI.swift ๋ถ์
- ํต์ฌ ํฌ์ธํธ ์ ๋ฆฌ
- ์ค์ต ์ฒดํฌ๋ฆฌ์คํธ
- ๋ง๋ฌด๋ฆฌ
1. ๊ฐ์
์ด๋ฒ 12์ฃผ์ฐจ์์๋ BMI(Body Mass Index) ๊ณ์ฐ๊ธฐ ์ฑ์ UIKit ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํํ ์ฝ๋๋ฅผ ๋ถ์ํฉ๋๋ค.
ViewController.swift์ BMI.swift ๋ ํ์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ,
์
๋ ฅ๊ฐ ์ฒ๋ฆฌ → BMI ๊ณ์ฐ → ์นดํ
๊ณ ๋ฆฌ ๋ถ๋ฅ → ํ๋ฉด ์ถ๋ ฅ
๊น์ง์ ํ๋ฆ์ ๋ช
ํํ๊ฒ ์ดํดํ๋ ๊ฒ์ด ํต์ฌ์
๋๋ค.
2. ์ ์ฒด ์ฝ๋ ๊ตฌ์กฐ ์ค๋ช
์ด ํ๋ก์ ํธ๋ ํฌ๊ฒ ๋ค์ ๋ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
โ UI ๋ก์ง — ViewController.swift
- ํ ์คํธ ์ ๋ ฅ ์ฒ๋ฆฌ
- BMI ๊ณ์ฐ ๋ฒํผ ์ด๋ฒคํธ
- ๊ฒฐ๊ณผ ์ถ๋ ฅ
- ํค๋ณด๋ ์ ์ด
- BMI ๊ธฐ์ค ํ์
- ์ฑ๋ณ SegmentedControl ์ ํ
โ BMI ๋ชจ๋ธ — BMI.swift
- BMI ์์น ๊ณ์ฐ
- BMI ์นดํ ๊ณ ๋ฆฌ(enum) ์ ์
- ํ์์ฉ ๊ฒฐ๊ณผ ํ ์คํธ ์์ฑ
MVC ๊ตฌ์กฐ ์ค ViewController = View + Controller,
BMI ๊ตฌ์กฐ์ฒด๋ Model ์ญํ ์ ๋ช
ํํ๊ฒ ์ํํ๊ณ ์์ต๋๋ค.
3. ViewController.swift ๋ถ์
์ฌ๊ธฐ์๋ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ํค์ ๋ชธ๋ฌด๊ฒ๋ฅผ ๊ฐ์ ธ์ BMI ๋ชจ๋ธ์ ์ ๋ฌํฉ๋๋ค.
โ 3-1. ์ ๋ ฅ์ฐฝ ๊ธฐ๋ณธ ์ค์
txtHeight.placeholder = "ํค(cm)๋ฅผ ์
๋ ฅํ์ธ์"
txtWeight.placeholder = "๋ชธ๋ฌด๊ฒ(kg)๋ฅผ ์
๋ ฅํ์ธ์"
txtHeight.keyboardType = .decimalPad
txtWeight.keyboardType = .decimalPad
- ์๋ฆฌํ์ ํ ์คํธ ์ค์
- ์ซ์ ํคํจ๋ ์ฌ์ฉ ์ง์
๐ก iOS์์ decimalPad๋ ์์ ์ ๋ ฅ์ด ํ์ํ ์ฑ์์ ํ์์ ์ธ ์ค์ ์ ๋๋ค.
โ 3-2. ์ ๋ ฅ๊ฐ ๊ฒ์ฆ ํ BMI ๊ณ์ฐ
guard
let h = parseNumber(from: txtHeight.text),
let w = parseNumber(from: txtWeight.text),
h > 0, w > 0
else {
lblResult.textColor = .red
lblResult.text = "์ ํจํ ํค(cm)์ ๋ชธ๋ฌด๊ฒ(kg)๋ฅผ ์
๋ ฅํ์ธ์"
return
}
์ฌ๊ธฐ์ ์ค์ํ ์
- guard ๋ฌธ์ ์ด์ฉํด ์๋ชป๋ ์ ๋ ฅ์ ๋น ๋ฅด๊ฒ ์ฐจ๋จ (Early Exit)
- ๋ฌธ์์ด → Double ๋ณํ์ parseNumber() ํจ์๊ฐ ๋ด๋น
- UI ๊ฒฝ๊ณ ์ฒ๋ฆฌ๊น์ง ํ ๋ฒ์ ์ํ
โ 3-3. BMI ์์ฑ ๋ฐ ํ์
let bmi = BMI(weight: w, height: h)
lastBMI = bmi
lblResult.text = bmi.resultText
lblResult.textColor = color(for: bmi.category)
ํต์ฌ ๋ก์ง
- BMI ๊ตฌ์กฐ์ฒด ์ธ์คํด์ค ์์ฑ
- lastBMI ์ ์ฅ (ํ์ ์ ๋ณด ํ์ ์ํด)
- ๊ฒฐ๊ณผ ํ ์คํธ ํ์
- ์นดํ ๊ณ ๋ฆฌ๋ณ ์์ ๋ณ๊ฒฝ
์์ ๋ณํ ๊ธฐ์ค
BMI ๋จ๊ณ ์์
| ์ ์ฒด์ค | ํ๋์ |
| ์ ์ | ์ด๋ก์ |
| 1๋จ๊ณ ๋น๋ง | ์ฃผํฉ์ |
| 2๋จ๊ณ ๋น๋ง | ๋นจ๊ฐ์ |
| 3๋จ๊ณ ๋น๋ง | ์งํ ๋ ๋ |
UI ํผ๋๋ฐฑ์ด ๋ช ํํ ์ ์ด ์ฅ์ ์ ๋๋ค.
โ 3-4. ํค๋ณด๋ ์ ์ด
func textFieldShouldReturn(_ textField: UITextField) -> Bool
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
- return ํค๋ก ๋ค์ ์ ๋ ฅ์นธ ์ด๋
- ํ๋ฉด ํฐ์น ์ ํค๋ณด๋ ๋ด๋ ค๊ฐ
iOS UX์์ ๊ฐ์ฅ ์์ฃผ ์ฐ์ด๋ ํจํด์ ๋๋ค.
โ 3-5. BMI ์ค๋ช ํ์
ํ์ฌ ๊ณ์ฐ๋ BMI ๊ธฐ์คํ๋ฅผ Alert๋ก ์๊ฐ์ ์ผ๋ก ์๋ดํฉ๋๋ค.
let alert = UIAlertController(
title: "BMI ๋ถ๋ฅ ๊ธฐ์ค",
message: message,
preferredStyle: .alert
)
์ฌ์ฉ์๊ฐ ๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ฒ ์ดํดํ๋๋ก ๋๋ ์ข์ UI ๊ตฌ์ฑ์ ๋๋ค.
โ 3-6. ์ฑ๋ณ SegmentedControl
@IBAction func scFM(_ sender: UISegmentedControl) {
if sender.selectedSegmentIndex == 0 {
} else {
}
}
์์ง ๋ก์ง์ ๋น์ด ์์ผ๋,
ํฅํ ์ฑ๋ณ์ ๋ฐ๋ผ ์๋ก์ด BMI ๊ธฐ์ค์ ์ ์ฉํ๊ฑฐ๋
์ฒด์ง๋ฐฉ๋ฅ ๊ณ์ฐ(๊ตฐ๋์ ๊ณต์ ๋ฑ) ๋ ์ ์ฉ ๊ฐ๋ฅํ๊ฒ ํ์ฅ๋์ด ์์ต๋๋ค.
4. BMI.swift ๋ถ์
โ 4-1. BMI ๋จ๊ณ enum
enum BMICategory {
case underweight
case normal
case obese1
case obese2
case obese3
}
๋ช ํํ ๊ตฌ๋ถ, ์ง๊ด์ ์ธ ๊ตฌ์กฐ.
โ 4-2. BMI ๊ฐ ๊ณ์ฐ
var value: Double {
let meter = height / 100.0
return weight / (meter * meter)
}
ํต์ฌ ๊ณต์
BMI = ์ฒด์ค(kg) / ํค(m)^2
โ 4-3. BMI ๋จ๊ณ ๋ถ๋ฅ
switch value {
case ..<18.5:
case 18.5..<25:
case 25..<30:
case 30..<40:
default:
}
Swift 5.7 ์ดํ ์ง์๋๋
..<, default ๋ฌธ๋ฒ์ ์ ์ฌ์ฉํ ๊น๋ํ ๋ถ๋ฅ์
๋๋ค.
โ 4-4. ๊ฒฐ๊ณผ ๋ฌธ์ฅ ์์ฑ
var resultText: String {
let shortened = String(format: "%.1f", value)
return "BMI: \(shortened), ํ์ : \(category.description)"
}
- ์์์ 1์๋ฆฌ ํ๊ธฐ
- enum description์ ํ์ฉํ ๊ฐ๋จํ๊ณ ์ผ๊ด๋ ์ถ๋ ฅ
5. ํต์ฌ ํฌ์ธํธ ์ ๋ฆฌ
ํญ๋ชฉ ์์ฝ
| MVC ๊ตฌ์ฑ | BMI ๊ตฌ์กฐ์ฒด(Model) + ViewController(VC) ์ญํ ๋ถ๋ฆฌ |
| ์ ๋ ฅ ์ฒ๋ฆฌ | guard๋ก ๊น๋ํ ์ค๋ฅ ์ฒ๋ฆฌ |
| ๋ฐ์ดํฐ ๋ณํ | parseNumber()๋ก ์ซ์ ์ฒ๋ฆฌ ์์ ์ฑ ๊ทน๋ํ |
| UI ํผ๋๋ฐฑ | ์์, alert ๋ฑ์ผ๋ก ์ฌ์ฉ์ ๊ฒฝํ ๊ฐํ |
| ํ์ฅ์ฑ | ์ฑ๋ณ·์ฒด์ง๋ฐฉ๋ฅ ·BMI ๊ทธ๋ํ ๋ฑ ํ์ฅ ๊ฐ๋ฅ |
6. ์ค์ต ์ฒดํฌ๋ฆฌ์คํธ
โ ํค ์
๋ ฅ ์ ์๋ ํฌ์ปค์ค ์ด๋ ๋์ ๊ตฌํ
โ BMI ๊ณ์ฐ๊ฐ์ด ์ฆ์ ๋ฐ์๋๋์ง ํ
์คํธ
โ ์๋ชป๋ ์
๋ ฅ ์ ์ค๋ฅ ๋ฉ์์ง ์ถ๋ ฅ ํ์ธ
โ Alert ํ์
ํ์ ์ ์ ์๋
โ ์์ ๋ณ๊ฒฝ ๋ก์ง ํ์ธ
โ SegmentedControl์ ์ด์ฉํด ๋จ/๋
BMI ๊ธฐ์ค ๋ณ๊ฒฝ ์ค์ต
7. ๋ง๋ฌด๋ฆฌ
์ด๋ฒ 12์ฃผ์ฐจ์์๋ UIKit ๊ธฐ๋ฐ BMI ๊ณ์ฐ๊ธฐ ์ ์ฒด ๊ตฌ์กฐ๋ฅผ ๋ถ์ํ์ต๋๋ค.
์ด ์ฑ์ ์
๋ ฅ ์ฒ๋ฆฌ → ๋ชจ๋ธ ๊ณ์ฐ → ์๊ฐ์ ์ถ๋ ฅ๊น์ง MVC ๊ตฌ์กฐ๋ก ๊น๋ํ๊ฒ ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ,
Swift ์ด๊ธ์์ ์ค๊ธ์ผ๋ก ์ฌ๋ผ๊ฐ๋ ๊ณผ์ ์์ ๊ผญ ์์์ผ ํ ํจํด๋ค์ด ๋ชจ๋ ํฌํจ๋์ด ์์ต๋๋ค.
'iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [iOS] Swift ๋ฐ์ดํฐ ํ์ ยท Tuple ยท Optional ยท ์ฐ์ฐ์ ยท ์ ์ด๋ฌธ ์ ๋ฆฌ (0) | 2026.03.16 |
|---|---|
| [iOS]BMI ์ฑ ๋ง๋ค๊ธฐ 3์ฃผ์ฐจ (0) | 2025.11.25 |
| [iOS] BMI ์ฑ ๋ง๋ค๊ธฐ 1์ฃผ (0) | 2025.11.11 |
| [iOS]10์ฃผ์ฐจ ์ดํ โ BMI ํ์ / ๋์์ ์ฌ์ / ์น๋ทฐ ์ฑ ๋ง๋ค๊ธฐ (0) | 2025.11.04 |
| [iOS]9 ์ฃผ์ฐจ โ Xcode๋ก ๊ฐ๋จํ ์ฑ ๊ฐ๋ฐ ์ ๋ฆฌ (0) | 2025.10.28 |