-

— BMI Calculator – Weight Loss 같은 인기 iOS용 BMI 계산기 앱을 분석해보면서, 당신이 만들려는 앱에 적용할 수 있는 강점과 약점을 정리해볼게요. 이후엔 개선점도 함께 제안할게요.
✅ 분석 대상 앱 개요
- 앱 이름: BMI Calculator – Weight Loss (iOS) App Store
- 특징 요약:
- 사용자 평가: 높은 평점 (4.6/5) + 수만 건의 리뷰. App Store
👍 강점
- 단순하고 핵심 기능에 집중
BMI 계산 → 결과 표시라는 단일 흐름이 명확해 사용성이 좋음. 복잡한 흐름 없이 바로 계산 가능한 게 장점. - 다양한 단위 및 사용자 상황 대응
미터법/영국법 단위를 모두 지원하고, 어린이 연령까지 고려함. 국제적 사용자·다른 기준(WHO vs DGE) 대응. - 시각화와 즉각 피드백 제공
애니메이션 게이지 + 컬러 코드로 사용자에게 “지금 내 BMI는 어느 범주인가”를 직관적으로 보여줌. - 오프라인에서도 사용 가능
별도 인터넷 연결이 필요 없다는 점은 사용자 편의성 및 접근성 측면에서 긍정적. - 명확한 대상/용도 설정
‘몸무게 감량 또는 증량 여정에서 BMI 추적’이라는 맥락이 명확히 제시됨. 사용자 기대치 관리됨.
👎 약점 / 한계
- BMI 지표 자체의 제한성
여러 출처에서 언급하듯, BMI는 근육량, 체지방률, 체형 등을 고려하지 않음. Live Science+1
예컨대 운동선수는 BMI상 “비만”으로 나올 수 있다는 비판이 있음. Live Science+1
→ 즉, 앱의 기능이 단순 BMI 계산에 머무르면 “의료적 조언 아님”이라는 면이 강조되어야 함. 본 앱도 해당 주의사항 안내 함. App Store - 기능 확장성 부족
단순 계산 + 결과 표시 기능엔 너무 익숙한 구조라, 차별화 기능이 적으면 사용자 충성도/재사용성이 떨어질 수 있음.
예컨대 체지방률, 근육량, 식단 연동, Apple Health 동기화 등이 부족할 수 있음. - 수익 모델 혹은 사용자 확보 전략이 단순
무료 + 인앱 구매 형태지만, 건강/피트니스 앱 시장 경쟁이 치열함. 기능만으로 경쟁하기엔 어려움 있음. - 사용자 맞춤형 인사이트 부족
BMI 수치만 던져줘서는 “그래서 내가 뭘 해야 하지?”라는 질문에 답이 약할 수 있음. 즉, 목표 설정, 진행 추적, 동기 부여 요소가 약할 수 있음. - 지역/언어/문화별 맞춤 고려 부족 가능성
BMI 기준과 건강 인식은 지역마다 다를 수 있음. 예컨대 한국·아시아권의 체형·건강 기준에 맞춘 로컬화가 안 되어 있을 수 있음.
🔍 당신이 만들 앱에 적용할 제언
- 디퍼렌셜 기능 추가
- BMI 외에 체지방률 또는 근육량 추정 기능 추가 (간단한 질문/데이터 입력으로)
- 진행 추적 기능: 사용자가 이전 BMI 값 저장하고 변화 그래프 제공
- 목표 설정 및 알림 기능: “다음 목표 BMI 22까지” + 알림 리마인더
- Apple Health(헬스킷) 연동
iOS 생태계 장점을 살려서 사용자의 체중/키 데이터를 Health 앱에서 자동 불러오거나 기록하게 하면 편의성 증가됨. (참고로 iMore 기사 언급됨: iPhone 자체 Health 앱에서 BMI 기록 가능) iMore - 지역/문화 맞춤화
한국 사용자라면 아시아 기준 BMI, 한글 UI/용어, 한국어 건강 팁, kg/cm 기본 단위 등을 기본으로 세팅하면 호응 높아질 수 있음. - 교육적 컨텐츠 및 위험 고지
BMI 수치만 보여주는 대신 “BMI는 참고용입니다. 근육량/체지방률 고려되지 않습니다” 같은 안내문 삽입해서 신뢰도 높이기. 실제로 Reddit 사용자들도 다음과 같이 언급함: - “BMI is very, very flawed. But … it should probably not just straight up say ‘healthy’ or simplistic answers like that” Reddit
- 차별화된 UI/UX
단순 계산기라서 디자인이 중요함. 게이지, 컬러, 애니메이션, 위젯(홈화면 위젯)등으로 사용자 경험 강화. - 모델 다변화 및 확장 가능성 고려
BMI → 이상 체중 → 운동 추천/식단 추천 → 트래킹 → SNS 공유 기능 등 확장성을 미리 염두에 두면 장기적으로 앱이 살아남기 유리.
초보 개발자 기준으로 Storyboard 기반 BMI 계산기 iOS 앱 (Swift) 을 클론코딩 스타일로 단계별 따라 하기로 정리해드릴게요.
🎯 목표
“키(cm)와 몸무게(kg)를 입력하면 BMI를 계산하고 결과를 UILabel로 보여주는 간단한 앱”
✅ Swift, UIKit, Storyboard 기반
✅ BMI 계산 공식:BMI=weight (kg)(height (m))2BMI = \frac{\text{weight (kg)}}{(\text{height (m)})^2}
✅ 결과 메시지: 저체중 / 정상 / 과체중 / 비만
🧩 1단계: 새 프로젝트 만들기
- Xcode 실행 → “Create a new Xcode project” 클릭
- Template: App
- Interface: Storyboard
- Language: Swift
- Product Name: BMICalculator_msi
- Save → 실행하면 빈 화면이 나와요.
🧱 2단계: UI 구성 (Storyboard)
Main.storyboard 열고 아래처럼 구성합니다 👇
UI 요소역할속성 설정UILabel 제목 text: "BMI 계산기" / font: bold 24 UITextField 키 입력 placeholder: "키 (cm)" / keyboardType: decimalPad UITextField 몸무게 입력 placeholder: "몸무게 (kg)" / keyboardType: decimalPad UIButton 계산 버튼 title: "BMI 계산" UILabel 결과 표시 text: "결과가 여기에 표시됩니다" / alignment: center / numberOfLines: 2 💡 AutoLayout
- 각 요소를 수직으로 Stack View로 묶어서 가운데 정렬
- 각 TextField 높이 40, width 200
- 버튼은 height 45
- 결과 Label은 height 60
🧩 3단계: IBOutlet & IBAction 연결
Main.storyboard에서 ViewController.swift 로 다음 연결을 해주세요.
- 키 입력창 → heightTextField
- 몸무게 입력창 → weightTextField
- 결과 Label → resultLabel
- 계산 버튼 → calculateBMI(_ sender: UIButton)
🧠 4단계: ViewController.swift 코드 작성
import UIKit class ViewController: UIViewController { // MARK: - Outlets @IBOutlet weak var heightTextField: UITextField! @IBOutlet weak var weightTextField: UITextField! @IBOutlet weak var resultLabel: UILabel! // MARK: - Actions @IBAction func calculateBMI(_ sender: UIButton) { // 1. 키, 몸무게 값 가져오기 guard let heightText = heightTextField.text, let weightText = weightTextField.text, let height = Double(heightText), let weight = Double(weightText) else { resultLabel.text = "숫자를 정확히 입력하세요." return } // 2. cm → m 단위 변환 let heightInMeter = height / 100.0 // 3. BMI 계산 let bmi = weight / (heightInMeter * heightInMeter) // 4. 결과 메시지 var category = "" switch bmi { case ..<18.5: category = "저체중" case 18.5..<23.0: category = "정상" case 23.0..<25.0: category = "과체중" default: category = "비만" } // 5. 결과 표시 let formattedBMI = String(format: "%.1f", bmi) resultLabel.text = "BMI: \(formattedBMI)\n상태: \(category)" } override func viewDidLoad() { super.viewDidLoad() resultLabel.text = "키와 몸무게를 입력하세요." } }
🧾 5단계: 실행 결과 예시
입력출력 결과키: 170, 몸무게: 60 BMI: 20.8 / 상태: 정상 키: 165, 몸무게: 48 BMI: 17.6 / 상태: 저체중 키: 180, 몸무게: 90 BMI: 27.8 / 상태: 비만
🌈 6단계 (선택): 시각 효과 추가
👉 버튼 디자인
Storyboard → 버튼 선택 → “Attributes Inspector”:
- Background Color: System Blue
- Corner Radius: 10 (Identity Inspector → User Defined Runtime Attributes)
- Text Color: White
👉 Label 색상 변화 (BMI 상태별로)
아래처럼 switch문 안에 색상 추가 👇
switch bmi { case ..<18.5: category = "저체중" resultLabel.textColor = .systemBlue case 18.5..<23.0: category = "정상" resultLabel.textColor = .systemGreen case 23.0..<25.0: category = "과체중" resultLabel.textColor = .systemOrange default: category = "비만" resultLabel.textColor = .systemRed }
🧩 7단계: 키보드 내리기 (UX 개선)
사용자가 입력 후 키보드를 닫게 하려면 아래 코드 추가👇
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { self.view.endEditing(true) }
✅ 최종 결과
iPhone 시뮬레이터 실행 시:
BMI 계산기 [ 키(cm): 170 ] [ 몸무게(kg): 60 ] [ 계산 버튼 ] → BMI: 20.8 → 상태: 정상깔끔하고 실습용으로 완벽한 기본 BMI 계산기 완성! 🎉
원하신다면 이 다음 단계로
📱 “결과 화면 따로 만들기 (Segue + SecondViewController)”
혹은
📊 “BMI 기록 저장 기능 (UserDefaults)”
까지 확장한 버전도 이어서 만들어드릴 수 있어요.➡️ 다음으로 어떤 버전 원해요?
1️⃣ 결과 화면 분리 (Segue)
2️⃣ 기록 저장 (UserDefaults)
3️⃣ 디자인 업그레이드 (애니메이션 & 색상 테마)iOS 앱 개발에서는 흔히 Storyboard 기반 개발과 Swift 코드(UI 프로그래밍) 두 가지 접근 방식이 있죠.
아래에 두 방법의 비교표 (장단점 포함) 를 정리해드릴게요 👇
📊 iOS UI 개발 방식 비교표
구분🧱 Storyboard 기반 개발💻 Swift 코드(UI 프로그래밍)개발 방식 Xcode의 시각적 인터페이스 빌더(Storyboard)에서 드래그 & 드롭으로 UI 구성 Swift 코드로 UIView, UILabel, UIButton 등 직접 작성 난이도 초보자에게 익숙하고 빠름 (직관적) 처음엔 어렵지만 구조적, 확장성 높음 장점 - UI 배치가 눈에 보임 → 직관적
- 코드 작성량 적음
- 프로토타이핑 빠름
- 간단한 앱에 유리- Git 충돌 거의 없음
- 재사용성 및 유지보수 용이
- 런타임 시 동적 레이아웃 제어 쉬움
- 완전한 코드 기반 자동화 가능단점 - Storyboard 파일이 커지면 충돌, 로딩 느림
- 협업 시 병합 문제 자주 발생
- 복잡한 제약조건 제어 어려움
- UI 코드와 로직 분리 어려움- 처음부터 UI를 코드로 작성해야 해서 초기 진입장벽 높음
- 시각적으로 확인 어려움
- 단순 앱이라면 오히려 비효율적적합한 경우 - 초보자 학습용
- UI가 간단한 앱 (BMI 계산기, 메모장 등)
- 빠른 시제품(Prototype) 제작- 규모 있는 프로젝트
- 커스텀 UI/애니메이션 많을 때
- 협업 프로젝트 (Git)AutoLayout 제어 Xcode Inspector에서 시각적으로 설정 NSLayoutConstraint / SnapKit 등 코드로 지정 UI 재사용성 낮음 (화면마다 수동 편집) 높음 (UIView subclass로 컴포넌트화 가능) 협업 및 버전관리(Git) Storyboard XML 충돌 빈번 코드 기반이라 병합 안정적 빌드 속도 / 안정성 복잡할수록 느려짐 (대형 Storyboard) 비교적 빠름, 구조 안정적 미리보기(Preview) 즉시 미리보기 가능 (Interface Builder) SwiftUI에는 있음, UIKit엔 별도 코드 실행 필요 추천 대상 입문자, 개인 프로젝트, 단순 UI 앱 팀 프로젝트, 고급 개발자, 복잡한 앱 구조
🧭 정리 요약
- 🎯 초보자 / 클론코딩 / 작은 앱 → Storyboard 기반
- 예: BMI 계산기, 계산기, 간단한 로그인 앱
- 🧠 중급 이상 / 협업 / 커스텀 UI 많은 앱 → Swift 코드 기반
- 예: 인스타그램 클론, 쇼핑몰 앱, 대규모 프로젝트
**init 메소드(이니트 메서드)**는 “객체가 처음 만들어질 때(초기화될 때)” 자동으로 실행되는 함수예요.
즉, Swift에서 클래스나 구조체의 속성들을 처음 설정해주는 역할을 하는 ‘초기화 함수’라고 보면 됩니다.
🧩 기본 개념 요약
항목설명이름 init() 역할 객체가 메모리에 생성될 때 초기값을 설정 호출 시점 MyClass()처럼 인스턴스를 만들 때 자동 호출 반환값 없음 (initializer이므로 return이 필요하지 않음)
💡 예시 1 — 간단한 구조체 초기화
struct Person { var name: String var age: Int // init 메소드 init(name: String, age: Int) { self.name = name // 전달받은 매개변수를 속성에 저장 self.age = age } } // 새로운 Person 객체 생성 시 init 자동 호출 let me = Person(name: "문수인", age: 25) print(me.name) // 문수인 print(me.age) // 25🧠 self.name = name 은 “이 구조체(Person)의 name 속성 ← init의 매개변수 name” 이란 뜻이에요.
💡 예시 2 — 클래스에서의 init
class BMIUser { var height: Double var weight: Double // 초기화 메서드 init(height: Double, weight: Double) { self.height = height self.weight = weight } func calculateBMI() -> Double { return weight / ((height / 100) * (height / 100)) } } let user = BMIUser(height: 170, weight: 60) print(user.calculateBMI()) // 20.76여기서 init()은 “BMIUser 객체가 처음 만들어질 때 height, weight를 받아서 설정해주는 역할”을 함.
💡 예시 3 — 기본값이 있는 init
struct Animal { var name: String var age: Int = 1 // 기본값 설정 init(name: String) { self.name = name } } let cat = Animal(name: "냥이") print(cat.age) // 1 (기본값 사용)
⚙️ Swift의 init 특징 정리
구분설명자동 초기화 제공 모든 속성이 기본값을 가지면 init() 자동 생성 매개변수 있는 초기화 원하는 값으로 속성을 초기화 가능 Convenience init 클래스에서 보조 초기화자 작성 가능 (convenience init) 상속 시 주의 클래스는 상위 클래스의 init을 상속하거나 override해야 할 수도 있음
🚀 간단한 비유
“객체가 태어날 때 처음으로 하는 자기소개”
— 이름, 키, 나이 같은 정보를 채워 넣는 단계!let bmi = weight / (height*height*0.0001) // kg/m*m let shortenedBmi = String(format: "%.1f", bmi)
이 두 줄은 **BMI(체질량지수)**를 계산하고, 그 결과를 소수점 한 자리까지만 문자열로 변환하는 코드예요.
하나씩 천천히 뜯어볼게요 👇
🧮 1️⃣ BMI 계산 부분
let bmi = weight / (height * height * 0.0001) // kg/m*m💡 의미 정리
부분설명weight 사용자가 입력한 몸무게 (kg 단위) height 사용자가 입력한 키 (cm 단위) 0.0001 cm를 m 단위로 바꾸기 위한 변환 계수 height * height * 0.0001 (cm × cm × 0.0001) = (m × m) weight / (height * height * 0.0001) BMI 공식에 맞게 계산한 결과
🧠 왜 0.0001을 곱할까?
BMI 공식은 원래 이렇게 생겼어요:
BMI=체중(kg)(신장(m))2BMI = \frac{체중(kg)}{(신장(m))^2}
그런데 사용자가 cm 단위로 키를 입력하니까,
cm → m로 바꿔야 하죠.- 1m = 100cm
- 즉, m = cm / 100
- 따라서(m)2=(cm100)2=cm2×0.0001(m)^2 = (\frac{cm}{100})^2 = cm^2 \times 0.0001
→ 그래서 height * height * 0.0001 를 사용하는 거예요!
🧾 예시
let height = 170.0 // cm let weight = 60.0 // kg let bmi = weight / (height * height * 0.0001) print(bmi) // 20.76✅ 계산 과정:
height * height * 0.0001 = 170 * 170 * 0.0001 = 2.89 weight / 2.89 = 20.76
✂️ 2️⃣ BMI 값의 소수점 자리수 제한
let shortenedBmi = String(format: "%.1f", bmi)💬 역할
👉 bmi 값(예: 20.76470588...)을
소수점 한 자리까지만 남긴 문자열(String) 로 바꿉니다.포맷의미"%.1f" 소수점 이하 1자리까지 표시 (float 형식) "%.2f" 소수점 이하 2자리까지 표시 "%.0f" 정수만 표시
🧾 예시
let bmi = 20.7647 let shortenedBmi = String(format: "%.1f", bmi) print(shortenedBmi) // "20.8"즉,
숫자 20.7647 → 문자열 "20.8"
이렇게 깔끔하게 포맷팅한 거예요.
🧩 정리
코드기능결과let bmi = weight / (height * height * 0.0001) BMI 계산 (kg/cm 입력값 기준) 20.76 let shortenedBmi = String(format: "%.1f", bmi) BMI 결과를 소수점 한 자리 문자열로 변환 "20.8"
📘 요약
💬 “cm 단위 키를 이용해 BMI를 계산하고, 보기 좋게 소수점 한 자리로 표시하는 코드”
값을 넣지 않고 실행하면 강제

