문제 6 (프로그래밍) 교재 p.97-p.99의 BMI(Body Mass Index)를 구하는 예제입니다.
class Person(val name:String, val weight: Double, val height: Double)
fun calculateBMI(w: Double, h: Double): Double {
val heightInMeters = h / 100.0
return w / (heightInMeters * heightInMeters)
}
fun determineBMILevel(bmi: Double): String =
when {
bmi < 18.5 -> "Underweight"
bmi < 25.0 -> "Normal weight"
bmi < 30.0 -> "Overweight"
else -> "Obese"
}
■ 단계 1 : when 식 수정
when 다음에 괄호 없이 조건식을 사용했습니다. when 다음에 오는 괄호 안에는 인자(argument)를 지정하지만, 인자를 생략할 수 있습니다(책 96~97쪽 참조). in 연산자를 사용하려면 when 다음에 인자를 지정해야 합니다. 크게 달라지지 않았지만, in 연산자는 폐구간이므로 마지막 값(18.49)도 구간에 포함됩니다. 따라서 범위의 마지막 값은 18.4보다는 18.49와 같이 정밀도를 높이는 게 좋습니다.
fun determineBMILevel(bmi: Double): String =
when (bmi) {
in 0.0..18.49 -> "Underweight"
in 18.5.. 24.99 -> "Normal weight"
in 25.0..29.99 -> "Overweight"
else -> "Obese"
}
문제에서 원하는 정답은 사실 단계 1로 끝입니다(DecimalFormat()은 책 99쪽에 있는 코드를 사용하면 됩니다). 뭐가 더 남았나요? 사람마다 체질량 지수(BMI)가 다르잖아요. BMI 변화를 잘 기록해두면, 본인의 건강 상태 변화도 파악할 수 있구요... 그래서 뭔데요? "BMI도 클래스 Person의 속성(property)으로 추가하는 게 좋다" 입니다. 이 예제를 "객체지향 개념을 이해하는 예제로 활용해 보자" 는 겁니다.
■ 단계 2 : 클래스 Person에 속성 bmi 와 메소드 calculateBMI() 추가
클래스 Person은 현재 3개의 속성(name, weight, height)을 갖고 있습니다. 클래스 몸체(body) 안에 속성 bmi를 추가합니다. 클래스 속성은 선언과 함께 초깃값을 지정해야 합니다. 떠돌이(?) 함수 calculateBMI()를 클래스 Person의 멤버 함수로 추가합니다.
메소드 calculateBMI()는 더 이상 형식 인자가 필요없습니다. 클래스 속성 weight과 height를 클래스 내부에서 참조할 수 있기 때문입니다. 메소드 calculateBMI()는 BMI를 계산한 값을 반환하지 않고 클래스 속성 bmi에 저장합니다.
class Person(val name:String, val weight: Double, val height: Double) {
var bmi = 0.0
fun calculateBMI() {
val heightInMeters = height / 100.0 // 단위변환: cm를 meter로 변환
bmi = weight / (heightInMeters * heightInMeters)
}
}
코드에서 뭐가 달라질까요? calculateBMI()가 클래스에 속하지 않은 일반 함수 일 때 코드입니다.
fun main() {
val kim = Person("Kim", 70.0, 170.0)
val bmi = calculateBMI(kim.weight, kim.height)
. . . . . .
}
calculateBMI()를 클래스의 멤버 함수로 포함시켰을 때 코드입니다. 2장에서는 아직 클래스를 설명하지 않았기 때문에 독립적인 함수로 구현했지만, 객체 지행 개념을 적용하면 훨씬 효과적인 프로그램을 만들 수 있습니다.
fun main() {
val kim = Person("Kim", 70.0, 170.0)
kim.calculateBMI()
println("NAME = ${kim.name}, BMI = ${kim.bmi}")
}
'코틀린' 카테고리의 다른 글
코틀린: 인라인(inline) 함수와 noinline (0) | 2024.09.30 |
---|---|
코틀린: 함수형 프로그래밍과 일급 객체 (0) | 2024.09.30 |
코틀린 : 2장 테스트에 도전해 보세요( 5번 정답 해설) (0) | 2024.09.30 |
코틀린 : 2장 테스트에 도전해 보세요 (0) | 2024.09.14 |
코틀린: in과 범위 연산 (0) | 2024.09.14 |