[iOS]BMI ์•ฑ ๋งŒ๋“ค๊ธฐ 2์ฃผ

2025. 11. 18. 15:33ยทiOS

๐Ÿ“Œ ๋ชฉ์ฐจ

  1. ๊ฐœ์š”
  2. ์ „์ฒด ์ฝ”๋“œ ๊ตฌ์กฐ ์„ค๋ช…
  3. ViewController.swift ๋ถ„์„
  4. BMI.swift ๋ถ„์„
  5. ํ•ต์‹ฌ ํฌ์ธํŠธ ์ •๋ฆฌ
  6. ์‹ค์Šต ์ฒดํฌ๋ฆฌ์ŠคํŠธ
  7. ๋งˆ๋ฌด๋ฆฌ

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)

ํ•ต์‹ฌ ๋กœ์ง

  1. BMI ๊ตฌ์กฐ์ฒด ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
  2. lastBMI ์ €์žฅ (ํŒ์—… ์ •๋ณด ํ‘œ์‹œ ์œ„ํ•ด)
  3. ๊ฒฐ๊ณผ ํ…์ŠคํŠธ ํ‘œ์‹œ
  4. ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์ƒ‰์ƒ ๋ณ€๊ฒฝ

์ƒ‰์ƒ ๋ณ€ํ™” ๊ธฐ์ค€

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
'iOS' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [iOS] Swift ๋ฐ์ดํ„ฐ ํƒ€์ž… · Tuple · Optional · ์—ฐ์‚ฐ์ž · ์ œ์–ด๋ฌธ ์ •๋ฆฌ
  • [iOS]BMI ์•ฑ ๋งŒ๋“ค๊ธฐ 3์ฃผ์ฐจ
  • [iOS] BMI ์•ฑ ๋งŒ๋“ค๊ธฐ 1์ฃผ
  • [iOS]10์ฃผ์ฐจ ์ดํ›„ — BMI ํŒ์ • / ๋™์˜์ƒ ์žฌ์ƒ / ์›น๋ทฐ ์•ฑ ๋งŒ๋“ค๊ธฐ
harang Lee
harang Lee
404...
  • harang Lee
    SkyWith628
    harang Lee
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (122)
      • AI (51)
      • C (20)
      • C++ (23)
      • iOS (18)
      • Python (1)
      • AWS (4)
      • Git (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

    • GitHub
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    Cํ”„๋กœ๊ทธ๋ž˜๋ฐ
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.4
harang Lee
[iOS]BMI ์•ฑ ๋งŒ๋“ค๊ธฐ 2์ฃผ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”