1-H. 체질량지수(BMI) 계산기 만들기
01 자바 기초 1
1-H. 체질량지수(BMI) 계산기 만들기

 

이번 시간에는 체질량 지수를 계산하는 예제를 만들어 보겠습니다체질량 지수가 26인 경우에는 21인 사람에 비해서 당뇨병에 걸릴 가능성이 여성의 경우에는 8남성의 경우에는 4배에 달합니다또한 담석증 및 고혈압 발생 확률도 2~3배나 높아집니다수치별 정상 비정상 범위는 다음과 같습니다.

20 이하 : 저체중

20~25 : 정상

25~30 : 과체중

30~40 : 비만

40 이상 : 고도비만

체질량 지수를 계산하는 방법은 다음과 같습니다체중을 키의 제곱으로 나누면 됩니다여기서 키의 단위는 cm 가 아니라 미터 입니다.

체질량지수 체중(kg) / (m) / (m)

 

이번 예제를 만들기 위해서 EditText 에 안내문구를 표시하는 가이드 텍스트의 사용방법과 포맷형식을 지정해서 문자열을 생성하는 방법을 알아보겠습니다.

 

이번 단원 핵심 포인트 ]

# EditText 위젯 사용방법 #

레이아웃 파일에서 hint 속성으로 가이드 텍스트 지정

Ex) hint : Height

 

문자열 Format 형식 지정 방법 #

문자열에 정수 대입하기 : <String 변수> = String.format(“%d”, <정수형 변수>);

int num = 103;

String strNum =String.format(“%d”, num);    // strNum : “103”

문자열에 실수 대입하기 : <String 변수> = String.format(“%f”, <실수형 변수>);

double pie = 3.141592653589793;

String strNum =String.format(“%f”, pie);    // strNum : “3.14159”

문자열에 소수점 자리 지정해서 실수 대입하기 : <String 변수> = String.format(“%.<소수점 자리수>f”, <실수형 변수>);

double pie = 3.141592653589793;

String strNum =String.format(“%.2f”, pie);    // strNum : “3.14”

 

 

1) 화면 레이아웃 구성

 

(1) 새 소스프로젝트 생성

새로운 소스프로젝트를 생성하겠습니다먼저번 숫자 계산 예제를 그대로 사용해도 상관 없습니다메뉴 [File > New > New Project…] 를 선택합니다.

프로젝트 이름을 MyBMI 라고 지정하고 Next 버튼을 클릭합니다그 이후부터는 먼저 번에 소스 프로젝트를 생성할 때와 동일합니다.

(2) 레이아웃에 위젯 생성

화면에 위젯을 추가해 보겠습니다레이아웃 정보 파일(activity_main.xml)로 이동해서 자동으로 추가되어 있는 TextView 의 속성을 아래와 같이 변경합니다.

<TextView>

id : textView1

text : 0

 

그리고 2개의 EditText, 그리고 1개의 Button 위젯을 생성하겠습니다만약 먼저번 HelloWorld 예제를 그대로 사용하려면 Button 을 모두 삭제하고 새로운 Button 을 하나 생성하면 됩니다.

각 위젯들의 속성은 아래와 같이 변경하면 됩니다.

 

<1번째 EditText>

layout:width : 80dp

hint : Height

id : editText1

text : (내용삭제)

 

<2번째 EditText>

layout:width : 80dp

id : editText2

hint : Weight

text : (내용삭제)

 

<Button>

onClick : onBtnResult

text : Result

 

EditText 에는 text 속성의 내용을 삭제하고, hint 속성에 Height  Weight 를 입력합니다. hint 속성은 가이드 텍스트를 지정합니다. EditText 에 내용이 없을때 회색으로 글자가 나타나는데 이것이 가이드 텍스트 입니다스마트폰은 화면이 작기 때문에 한정된 공간에 많은 정보를 표시하기 위해서 가이드 텍스트를 사용합니다.

레이아웃 정보를 복사해도 됩니다화면 아래쪽에 Design 버튼 오른쪽에 Text 버튼을 누르고 텍스트 편집 모드로 이동합니다.

레이아웃 텍스트 편집 모드가 나타나면 내용을 모두 삭제하고 아래 코드를 입력합니다. Design 모드에서 마우스 클릭으로 위젯을 생성해도 되고 Text 편집 모드에서 타이핑으로 입력해도 됩니다. 2가지 방법 중에서 어느 것을 사용하던 결과는 같습니다.

[ Source code copy link : https://goo.gl/vFm4A4 => Code-1 ]

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:padding="20dp">

 

    <TextView

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="0"

        android:id="@+id/textView1" />

 

    <EditText

        android:layout_width="80dp"

        android:layout_height="wrap_content"

        android:id="@+id/editText1"

        android:layout_toEndOf="@+id/textView1"

        android:layout_marginStart="36dp"

        android:hint="Height" />

 

    <EditText

        android:layout_width="80dp"

        android:layout_height="wrap_content"

        android:id="@+id/editText2"

        android:layout_alignParentEnd="true"

        android:hint="Weight" />

 

    <Button

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="Result"

        android:layout_marginTop="37dp"

        android:layout_below="@+id/editText1"

        android:onClick="onBtnResult" />

</RelativeLayout>

 

이 상태에서 예제를 실행시켜 봅시다. EditText 에 내용이 없으면 회색으로 안내 문구가 나타납니다. hint 속성에 입력한 문자열이 안내문구인 것입니다. EditText 에 문자열을 입력해 봅시다가이드 텍스트는 사라지고 입력한 문자열이 검은색으로 표시됩니다.

2) 소스코드 작성

사용자의 키와 몸무게를 입력 받고 결과를 출력하기 위해서 위젯을 멤버변수로 선언하겠습니다액티비티 소스파일(MainActivity.java)로 이동해서 클래스 시작 부분 아래에 다음과 같은 새로운 코드를 추가합니다만약 빨간색 글씨가 나타나면 단축키 Alt+Enter 를 누르면 됩니다.

[ Source code copy link : https://goo.gl/vFm4A4 => Code-2 ]

public class MainActivity extends AppCompatActivity {

    TextView textView1;

    EditText editText1;

    EditText editText2;

TextView  2개의 EditText 를 저장하기 위한 멤버변수를 선언하였습니다먼저번 예제를 그대로 사용하는 경우에는 수정할 필요가 없습니다.

 

위젯들을 위 변수에 저장하겠습니다. onCreate() 함수에 아래와 같이 새로운 코드를 추가합니다.

[ Source code copy link : https://goo.gl/vFm4A4 => Code-3 ]

protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        textView1 = (TextView)findViewById(R.id.textView1);

        editText1 = (EditText)findViewById(R.id.editText1);

        editText2 = (EditText)findViewById(R.id.editText2);

    }

 

Result 버튼을 클릭하면 사용자가 입력한 키와 몸무계를 계산해서 체질량 지수를 화면에 표시하는 기능을 구현하겠습니다. onCreate() 함수 아래에 새로운 함수를 생성하고 함수 이름을 onBtnResult() 라고 지정합니다.

[ Source code copy link : https://goo.gl/vFm4A4 => Code-4 ]

public void onBtnResult(View v) {

    String strNum = editText1.getText().toString();

    double height = Integer.parseInt(strNum);

    strNum = editText2.getText().toString();

    double weight = Integer.parseInt(strNum);

    double result = weight / height / height * 10000;

    strNum = Double.toString(result);

    textView1.setText(strNum);

}

 

함수의 내용은 1번째 EditText 에서 키를 구하고, 2번째 EditText 에서 체중을 구하고체질량 지수를 계산해서 TextView 에 표시합니다.

 

아래는 체질량 지수를 계산하는 코드입니다체질량 지수를 계산할 때는 키를 cm 단위에서 미터 단위로 변경해서 제곱을 구한 다음체중에서 나눠주면 됩니다. cm 단위를 미터 단위로 변경하려면 100으로 나눠주야 하는데 2번 등장하기 때문에 10000 으로 나눠준 것입니다체중에서 키를 나누었기 때문에 여기에 10000을 곱하면 결과적으로 키를 10000 으로 나눈것과 같습니다.

    double result = weight / height / height * 10000;

 

아래는 결과를 TextView 에 표시하기 위해서 double 형식의 실수를 문자열로 변경하는 코드입니다. Integer.toString()  int 형의 정수를 문자열로 변경하는 함수라면, Double.toString()  double 형의 실수를 문자열로 변경하는 함수입니다.

    strNum = Double.toString(result);

 

예제를 실행해서 결과를 확인해 봅시다키와 몸무게를 입력하고 Result 버튼을 누르면 TextView 에 체질량 지수가 표시됩니다.

그런데 아쉬운 것이 있습니다결과값의 소수점 자리수가 너무 길다는 것입니다적당하게 소수점 2째 자리까지만 표시하도록 수정해 보겠습니다. onBtnResult() 함수에서 결과값을 문자열로 변경하는 코드 앞에 아래와 같이 ‘//’ 기호를 붙입니다.

    public void onBtnResult(View v) {

        String strNum = editText1.getText().toString();

        double height = Integer.parseInt(strNum);

        strNum = editText2.getText().toString();

        double weight = Integer.parseInt(strNum);

        double result = weight / height / height * 10000;

        //strNum = Double.toString(result);

        textView1.setText(strNum);

    }

‘//’ 는 주석이 시작된다는 의미입니다주석은 소스코드에 대한 설명을 코드 사이에 추가하는 것입니다이렇게 하면 컴파일 할 때 주석은 실행파일에 포함되지 않습니다.

 

결과값을 문자열로 변경하는 코드를 주석 처리하였으니 새로운 코드가 필요합니다. onBtnResult() 함수에 아래와 같이 새로운 코드를 추가합니다.

[ Source code copy link : https://goo.gl/vFm4A4 => Code-5 ]

public void onBtnResult(View v) {

        String strNum = editText1.getText().toString();

        double height = Integer.parseInt(strNum);

        strNum = editText2.getText().toString();

        double weight = Integer.parseInt(strNum);

        double result = weight / height / height * 10000;

        //strNum = Double.toString(result);

        strNum = String.format("%.2f", result);

        textView1.setText(strNum);

    }

 

String.format() 은 포맷을 지정해서 문자열을 생성하는 함수입니다문자열 포맷문에 사용되는 기호는 다음과 같습니다.

%f : 이 위치에 실수 값을 대입한다.

%.2f : 이 위치에 실수 값을 대입하고소수점 2째 자리 까지만 표시한다.

%d : 이 위치에 정수 값을 대입한다.

%s : 이 위치에 문자열을 대입한다.

 

result 변수에 저장된 숫자가 문자열로 변경되어서 소수점 2째 자리 이후는 버려지고 나머지가 strNum 에 저장되는 것입니다.

다시 예제를 실행해서 결과를 확인해 봅시다키와 몸무게를 입력하고 Result 버튼을 클릭하면 이번에는 소수점 2째 자리까지만 표시됩니다.

이번 예제의 전체 코드는 아래와 같습니다수고하셨습니다.

package com.example.mybmi;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

import android.widget.EditText;

import android.widget.TextView;

 

public class MainActivity extends AppCompatActivity {

    TextView textView1;

    EditText editText1;

    EditText editText2;

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        textView1 = (TextView)findViewById(R.id.textView1);

        editText1 = (EditText)findViewById(R.id.editText1);

        editText2 = (EditText)findViewById(R.id.editText2);

    }

 

    public void onBtnResult(View v) {

        String strNum = editText1.getText().toString();

        double height = Integer.parseInt(strNum);

        strNum = editText2.getText().toString();

        double weight = Integer.parseInt(strNum);

        double result = weight / height / height * 10000;

        //strNum = Double.toString(result);

        strNum = String.format("%.2f", result);

        textView1.setText(strNum);

    }

}

 

 

[연습문제] BMI 계산기 단위 변경

BMI 계산기의 Height 단위를 inch 로 변경하시오.

Weight 단위를 pound 로 변경하시오.

Tip : 1inch = 2.54cm

     1pound = 0.453592 kg

 

 

[연습문제브로카 지수 계산기 만들기

사전지식 : 브로카 지수는 키에 맞는 체중을 계산하는 방식이다.

(cm)에서 100을 빼고그런 다음에 0.9를 곱하면 된다.

 

1. 새로운 소스 프로젝트를 생성하고 레이아웃 파일에 TextView  EditTex, 그리고 Button 위젯을 1개씩 생성하시오.

 

2. Button 을 클릭하면 EditText 에 입력된 값을 구해서 100을 빼고다시 0.9를 곱하시오.

그리고 결과를 TextView 에 표시하시오.

질문하기
추가 자료
no files uploaded

추가 자료가 없습니다

여기서 새로운 학습 자료를 확인하세요!
선생님이 추가한 자료들을 바로 확인할 수 있어요.