Android

(Kotlin) 개발 공부 1일차 - BMI 계산기

돗개진 2024. 2. 27. 20:28

 

오늘은 Kotlin 언어를 사용하여 안드로이드 앱 개발을 위해 공부를 시작한 첫째 날이다.

 

Java를 사용해서 작은 어플을 개발한 경험은 있지만 Kotlin을 사용해 본 건 처음이라 신세계였다

C언어를 쓰다가 Python을 만났을 때의 기분을 그대로 느꼈다.

 

먼저 xml 코딩을 통해 UI를 구성하고 이후에 Activity 기능 구현을 Kotlin 코딩으로 마무리한다.

 

[  UI 구현 - XML  ]

[ BMI 계산기 UI  - MainActivity ]

BMI 계산기 UI - activity_main.xml

 

=> Main 화면을 구성하기 위해서 TextView, Button, EditText 사용

: TextView - 'BMI 계산기', '신장', '체중', 'cm', 'kg'

: EditText - 신장과 체중을 입력하는 칸

: Button - '확인하러 가기'

BMI 계산기 - activity_result.xml

 

=> Result 화면을 구성하기 위해서 TextView, Button, ImageView 사용

: TextView - '당신의 BMI 계산 결과는?', '19.2', '정상 체중'

: Button - '돌아가기'

: ImageView - 무표정의 이모지

 

=> 또한 각각 Common에게 id를 부여하여 기능과 타입을 분류해서 코딩의 효율성을 높일 수 있다.

activity_main.xml 코드 일부분

 

=> 위 이미지의 android:id="@+id/tv_main_title" 부분이 id를 부여하는 부분이다. tv_main_title은 TextView 타입의 메인 제목을 축약해서 알기 쉽게 적은 것이다.

 


 

[ 기능 구현 (Activity) - Kotlin ]

 

먼저 BMI 계산기 기능을 구현하려면 BMI 수치를 구하는 공식을 알아야 한다.

BMI 수치를 구하는 공식은 아래와 같다

 

* 유의점: 체중을 신장으로 나눌 때 신장의 단위가 cm가 아닌 m라는 점이다.

 

import kotlin.math.* // math 라이브러리 메소드 전체 사용
import kotlin.math.pow // math 라이브러리 메소드 중 pow 함수만 사용

ㄴ> 먼저 BMI 수치를 구하는 공식에는 제곱식이 있기 때문에 제곱을 표현할 수 있는 kotlin의 math 라이브러리를 사용해야 한다. 따라서 math 라이브러리를 import 한다. 

 

        // BMI 계산 (체중 / 신장(m) 제곱)
        var value = weight / (height/100.0).pow(2.0)
        value = round(value * 10)/10 // 소수점 첫째 자리까지 출력

ㄴ> 위 코드가 BMI 수치를 계산하는 코드이다. 제곱을 표현하기 위해 pow() 함수를 사용한다.

또한 신장 단위가 cm가 아닌 m라는 점을 생각하여 height를 100으로 나눈다. 

 

	// 결과창 출력 형태 설정
        var resultText = ""
        var resultImage = 0
        var resColor = 0
		
        // 조건문을 통해 BMI 수치 범위에 알맞은 결과 출력
        if(value < 18.5) {
            resultText = "저체중"
            resultImage = R.drawable.img_lv1
            resColor = Color.YELLOW
        } else if(value >= 18.5 && value < 23.0) {
            resultText = "정상 체중"
            resultImage = R.drawable.img_lv2
            resColor = Color.GREEN
        } else if(value >= 23.0 && value < 25.0) {
            resultText = "과체중"
            resultImage = R.drawable.img_lv3
            resColor = Color.BLACK
        } else if(value >= 25.0 && value < 30.0) {
            resultText = "경도 비만"
            resultImage = R.drawable.img_lv4
            resColor = Color.CYAN
        } else if(value >= 30.0 && value < 35.0) {
            resultText = "중정도 비만"
            resultImage = R.drawable.img_lv5
            resColor = Color.MAGENTA
        } else {
            resultText = "고도 비만"
            resultImage = R.drawable.img_lv6
            resColor = Color.RED
        }

ㄴ> if문을 사용하여 각 범위에 맞게 텍스트와 이미지가 알맞게 나오도록 제어한다. (이미지 파일은 drawable이라는 폴더에 저장하여 불러와 사용한다.)


 

 

[ 사용된 Kotlin 문법 간단 정리 (기억해 둘 만한 것 위주) ]

 

1. val 변수와 var 변수

	// 변수 선언
        val heightEditText = findViewById<EditText>(R.id.et_height)
        val weightEditText = findViewById<EditText>(R.id.et_weight)
        val submitButton = findViewById<Button>(R.id.btn_check)
        
        // 변수 선언, 신장과 체중
        val height: Int = heightEditText.text.toString().toInt()
        val weight: Int = weightEditText.text.toString().toInt()

ㄴ> 위 코드는 val 타입으로 선언된 변수이며 val 변수는 Value로 불변 변수이며 값이 할당된 이후로 변경할 수 없다. (단, 특정 클래스의 매개변수 타입이 var 변수이고 클래스 내부에 선언된 멤버 변수는 val 변수로 선언해도 변경 가능하다.)

 

	 // BMI 계산 (체중 / 신장(m) 제곱)
        var value = weight / (height/100.0).pow(2.0)
        value = round(value * 10)/10 // 소수점 첫째 자리까지 출력

        // 결과창 출력 형태 설정
        var resultText = ""
        var resultImage = 0
        var resColor = 0

ㄴ> 위 코드는 var 타입으로 선언된 변수이며 var 변수는 Variable로 가변 변수이다. var 변수는 값이 할당된 이후에도 값을 변경할 수 있다.

 

=> 따라서 가변되는 값을 담을 변수는 var로 선언하고 값이 변경되면 안 되는 경우엔 val로 변수를 선언하여 버그 발생 가능성을 낮추면 된다.

 

 

2. Intent 를 통한 Activity 간 값 전달

	  // MainActivity 에서 입력된 정보를 보냄 (Intent, intent.putExtra)
            val intent = Intent(this, ResultActivity::class.java)
            intent.putExtra("height", height)
            intent.putExtra("weight", weight)
            startActivity(intent)

ㄴ> 위 코드는 MainActivity에서 입력된 정보를 보내기 위해 작성된 코드다. 정보를 보내기 위해서는 putExtra() 메소드를 사용하면 된다.

 

	// MainActivity 에서 보낸 값을 ResultActivity로 가져옴
        val height = intent.getIntExtra("height", 0)
        val weight = intent.getIntExtra("weight", 0)

ㄴ> 위 코드는 MainActivity에서 보낸 값을 ResultActivity로 가져오기 위한 코드이다. 정보를 가져오기 위해서는 getInExtra() 메소드를 사용하면 된다.