비가 한번 내리더니 따뜻했던 날씨가 급 추워졌네요
환절기에 감기 조심하셔서 코로나로 의심받지 않으시길..
아무튼 오늘의 학습 주제는
코틀린(Kotlin)의 문자열(String)과 숫자(Numeric)입니다
먼저 문자열부터 보겠습니다
import kotlin.math.roundToInt
const val TAVERN_NAME = "Taernyl's Folly"
var playerGold = 10
var playerSilver = 10
private fun performPurchase(price: Double) {
displayBalance()
val totalPurse = playerGold + (playerSilver / 100.0)
println("Total amount of wallet : Gold coins $totalPurse")
println("Purchased alcohol for $price gold coins ")
val remainingBalance = totalPurse - price
println("Remaining balance : ${"%.2f".format(remainingBalance)}")
val remainingGold = remainingBalance.toInt()
val remainingSilver = (remainingBalance % 1 * 100).roundToInt()
playerGold = remainingGold
playerSilver = remainingSilver
displayBalance()
}
private fun displayBalance() {
println("Player balance : Gold coins $playerGold, Silver coins $playerSilver")
}
private fun toDragonSpeak(phrase: String) = phrase.replace(Regex("[aeiou]")) {
when ( it.value ) {
"a" -> "4"
"e" -> "3"
"i" -> "1"
"o" -> "0"
"u" -> "|_|"
else -> it.value
}
}
private fun placeOrder(menuData: String) {
val indexOfApostrophe = TAVERN_NAME.indexOf('\'')
val tavernMaster = TAVERN_NAME.substring(0 until indexOfApostrophe)
println("Order from $tavernMaster")
/*
val data = menuData.split(',')
val type = data[0]
val name = data[1]
val price = data[2]
*/
//destructuring declaration
val (type, name, price) = menuData.split(',')
val message = "Buy a $name ($type) for $price gold coins"
println(message)
performPurchase(price.toDoubleOrNull() ?: 0.0)
val phrase = if ( name == "Dragon's Breath" ) {
"Admire: $name is really good"
} else {
"Say: Thank you, $name"
}
println("${toDragonSpeak(phrase)}")
}
fun main() {
placeOrder("shandy,Dragon's Breath,5.91")
}
위의 코드를 살펴보면 placeOrder()함수는 상수로 선언된 TAVERN_NAME을
substring()을 이용하여 '까지의 문자열("Taernyl")을 tavernMaster에 저장하고
파라미터로 받은 문자열 menuData를 , 로 split()하여 각각 type, name, price에 저장합니다
val ( type, name, price ) = menuData.split(',')
이 때 특이한 점은 해체 선언(destructuring declaration)이라 하여
위의 코드처럼 하여도 주석처리한 부분과 동일한 결과를 얻습니다
private fun toDragonSpeak(phrase: String) = phrase.replace(Regex("[aeiou]")) {
when ( it.value ) {
"a" -> "4"
"e" -> "3"
"i" -> "1"
"o" -> "0"
"u" -> "|_|"
else -> it.value
}
}
위의 toDragonSpeak()함수는 파라미터로 받은 phrase를
replace 함수를 이용하여 문자를 변경합니다
이 때 replace로 phrase가 변경되는 것은 아니고 새로운 문자열을 생성합니다
replace 함수에 인자는 두가지인데 첫번째 인자는 정규 표현식(regular expression) [aeiou]을
두번째 인자에는 [aeiou]와 일치하는 문자들을 무엇으로 변경할지 정의하는 익명 함수를 받고 있습니다
val phrase = if ( name == "Dragon's Breath" ) {
"Admire: $name is really good"
} else {
"Say: Thank you, $name"
}
코틀린에서는 문자열 비교를 == 연산자를 이용해서 합니다
자바(Java)에 익숙하신 분들은 이 부분이 다소 헤깔릴 수 있는데
자바에서는 문자열 비교를 equals()를 이용하고
== 연산자는 참조 동등(referential equality)으로 이용하기 때문입니다
코틀린은 이 참조 동등을 === 연산자를 이용합니다
private fun performPurchase(price: Double) {
displayBalance()
val totalPurse = playerGold + (playerSilver / 100.0)
println("Total amount of wallet : Gold coins $totalPurse")
println("Purchased alcohol for $price gold coins ")
val remainingBalance = totalPurse - price
println("Remaining balance : ${"%.2f".format(remainingBalance)}")
val remainingGold = remainingBalance.toInt()
val remainingSilver = (remainingBalance % 1 * 100).roundToInt()
playerGold = remainingGold
playerSilver = remainingSilver
displayBalance()
}
위의 함수는 코틀린에서 숫자 처리를 어떻게 하는지 보여주는데요
자세한 설명은 생략하고 아래의 비트(이진) 연산(bitwise operation) 함수을 소개하면서
오늘의 학습을 마치겠습니다
함수 | 설명 | 예 |
Integer.toBinaryString | 정숫값을 이진 형태의 문자열로 변환 | Integer.toBinaryString(42) |
shl(bitcount) | 부호 비트는 그대로 두고 지정된 비트 수만큼 모든 비트를 왼쪽으로 이동 | 42.shl(2) |
shr(bitcount) | 부호 비트는 그대로 두고 지정된 비트 수만큼 모든 비트를 오른쪽으로 이동 | 42.shr(2) |
ushr(bitcount) | 부호 비트를 포함해서 지정된 비트 수만큼 모든 비트를 오른쪽으로 이동 | 42.ushr(2) |
inv() | 모든 비트의 값을 반대로 변경 | 42.inv() |
xor(number) | 대응되는 위치의 각 비트에 대해 논리XOR(exclusive or) 연산을 수행 | 42.xor(33) |
or(number) | 대응되는 위치의 각 비트에 대해 논리 OR 연산을 수행 | 42.or(33) |
and(number) | 대응되는 위치의 각 비트에 대해 논리 AND 연산을 수행 | 42.and(33) |
그럼 이만-_-
'Android' 카테고리의 다른 글
[Android] 코틀린(Kotlin) 컬렉션(Collection) (0) | 2020.04.28 |
---|---|
[Android] 코틀린(Kotlin) 표준 라이브러리 함수(Standard Library Functions) (0) | 2020.04.26 |
[Android] 코틀린(Kotlin) null과 예외(Exception) (0) | 2020.04.18 |
[Android] 코틀린(Kotlin) 함수(Function) (0) | 2020.04.18 |
[Android] 코틀린(Kotlin) 변수(Variable)/상수(Constant)/데이터 타입(Data type)/제어 흐름(Control flow) (0) | 2020.04.17 |