안드로이드를 공부하기 위해 관련된 강의를 수강중에 있다. 강의 중 아주 매우 간단한 BMI 계산기를 만들었다. 완성하면서 의문점이나 사용했던 방법에 대해서, 새로 알게된 사실에 대해서 정리하는 게시글이 될 것 같다.
# 최종 결과물
결과물은 아주매우 간단하다. 첫번째 액티비티에서 신장과 체중을 입력하면 두번째 액티비티를 인탠트로 연결하고 BMI계산식과 그 결과를 알려준다.
# 알게 된 것 & 공부가 필요한 것
- 코틀린에서 사용되는 람다식(함수) -> 따로 정리
- empty와 blank와 null의 차이점 🔥
- 람다식에서 특정함수를 골라 return 시키는 법 -> 따로 정리
- Log의 사용법 🔥
- apply{...} 🔥
- when{...} 🔥
- LinearLayout - gravity 속성 🔥
- editText에서 가져온 text는 type이 number 일지라도 int가 아니다. 🔥
++ 코틀린에서 사용되는 람다식(정리)
# empty, blank, null 차이점 🔥
먼저 isEmpty()와 isNull()의 차이점을 비교해보면 간단하다.
val s1 = ""
s1.isEmpty() // true
s1.isBlank() // true
val s2 = " "
s2.isEmpty() // false
s2.isBlank() // true
공백문자(space)을 포함하는지에 여부를 살펴본다. 그렇기 때문에 EditText에서 입력받은 값을 toInt()로 바꿔주는 경우에는 isBlank()로 판별하는게 더 안전하다는 생각이 들었다. EditText로 값을 받아오면 아무값도 입력하지 않을경우 ""을 가져오는데 이것은 null과는 다르다.
null은 이와같이 "아무것도 할당되지 않은" 경우이다. 예컨데 선언만 해놓은 상태를 들을 수도 있는데, 코틀린은 java나 c++에서와 같이 선언만 해놓은경우를 null이라고 해석해 볼 수 있을 것 같다.
val s1 :String? = null
//C++
int num1;
string s1;
# Log 사용법 🔥
그전 개발을 할때는 LogCat을 적절히 이용하지 못했는데 이번 기회에 Log를 다루는 법도 습관하 해야 한다는 생각이 들었다.
Log에는 많은 종류가 있는데 대표적으로 Log.d와 Log.e를 많이 사용하는 것 같았다. d는 debug, e는 error 이다.
Log.d("MainAcvitviy", "버튼 클릭")
다음과 같이 tag와 msg형식으로 작성하면 Logcat에서 확인 할 수 있다. 또 Log별로 모아서 볼 수 있다.
tag에 어떤 액티비티인지를 작성하는 것 같다.
# editText에서 가져온 text는 type이 number 일지라도 int가 아니다 🔥
다음과 같이 EditText를 layout에 작성하고 inputType에 number라고 적어주게 되면 숫자키패드만 나와서 입력할 수 있게 해준다. 그저 뭘 입력하게만 해주는 기능이지, kotlin으로 안에 값을 가져올때는 무조건 string(문자열)형식이다.
val height:Int = heightEditText.text.toString().toInt()
val weight:Int = weightEditText.text.toString().toInt()
이렇게 text의 값을 가져온 후 toString()으로 바꿔주고 그걸 다시 toInt()로 바꾸어 사용해야한다는 말이다.
# LinearLayout - gravity , layoutgravity 🔥
LinearLayout에는 두가지의 정렬속성을 가진다.
layoutgravity는 해당 레이아웃 자체를 정렬시킨다.
gravity는 그 속에 있는 view를 정렬시킨다.
# apply{...} 🔥
코틀린에는 apply, with, let, also, run와 같은 특이한 함수가 존재한다. 이 함수들도 람다함수의 이해가 필요한거 같지만 apply를 공식문서에서 사용하는 것을 봤기 때문에 그에 맞게 사용해보려고 한다.
val bmiTextView = findViewById<TextView>(R.id.bmiTextView).apply {
text = bmi.toString()
}
val resultTextView = findViewById<TextView>(R.id.resultTextView).apply {
text = resultText
}
해당 객체의 프로퍼티를 바로 적용시켜줄때 사용하는데 좋은 예시가 있어서 가져와본다.
this가 생략됨에 따라서 아래와 같이 적기만해도 된다.
val adam = Person("Adam").apply {
age = 20
city = "London"
}
val adam = Person("Adam")
adam.age = 20
adam.city = "London"
# when { ... }
앞서 작성한 다른 게시물에서는 when을 switch문에 빗대어 비교했었다. 그래서 아래와 같이 사용한 것을 예제로 들었었다.
val x = 10
when(x) {
in 1..2 -> println("x is between 1 and 2")
in 3..10 -> println("x is between 3 and 10")
else -> {
println("x is over 10")
}
다음과 같이 활용이 가능했다.
val bmi = weight / (height / 100.0).pow(2.0)
val resultText = when {
bmi >= 35.0 -> "고도비만"
bmi >= 30.0 -> "중정도 비만"
bmi >= 25.0 -> "경도 비만"
bmi >= 23.0 -> "과체중"
bmi >= 18.0 -> "정상체중"
else -> "저체중"
}
when은 잘 사용하면 정말 편리한것 같다.
지금 의문점은 when(bmi)를 주면 빨간줄이 뜨는데 왜그런지 모르겠다..
아주 쉬운 예제프로젝트를 만들었지만, 그안에서 조금더 코틀린스러운 코드를 작성하기 위해서는 공부할게 더욱 많다는 것을 깨닫고 있다.
지금은 람다표현식에 대해서 확실히 알고싶다. 왜냐면 setOnClickListener{...} 가 대표적인 람다표현식을 사용하는거 같은데, 내가 저번에 기말프로젝트를 작성하면서 이부분에 대해서 잘 몰라서 꽤 애먹은 기억이 있다. 일단 지금은 람다가 익명함수를 나타내는것 그리고 C++에서 배웠던 개념과 비슷했고, JS에서 화살표함수를 사용했던거와 비슷한 느낌을 받았다. 다음 포스팅에서 람다 표현식과 코틀린에서 사용되는 함수들에서 람다표현식들이 어떻게 사용되고 있는지를 꼭 정리해봐야겠다느 생각이 들었다.