Android

[Android] 코틀린(Kotlin) 문자열(String)과 숫자(Numeric)

구루싸 2020. 4. 21. 22:44
반응형
SMALL

비가 한번 내리더니 따뜻했던 날씨가 급 추워졌네요

환절기에 감기 조심하셔서 코로나로 의심받지 않으시길..

아무튼 오늘의 학습 주제는

코틀린(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)

그럼 이만-_-

반응형
LIST