λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Kotlin

Kotlin_Null & λ¬Έμžμ—΄ & 숫자 νƒ€μž…

by λ„μΊλ¦¬πŸ± 2021. 6. 30.
λ°˜μ‘ν˜•

μ½”ν‹€λ¦°μ—μ„œλŠ” null 값이 지정될 수 μžˆλŠ” μš”μ†Œκ°€ μžˆλŠ”κ°€ ν•˜λ©΄ 그렇지 μ•Šμ€ μš”μ†Œλ„ μžˆλ‹€. 

nullable

non-nullable

 

* μžλ°”λŠ” μ–΄λ–€ νƒ€μž…μ˜ λ³€μˆ˜λ„ null 값을 κ°€μ§ˆ 수 μžˆλŠ”λ° κ·Έλž˜μ„œ NPE 둜 인해 앱이 ν¬λž˜μ‹œ λ˜λŠ” κ²½μš°κ°€ ν”ν•˜λ‹€.'

* null 값을 κ°€μ§ˆ 수 μžˆλ‹€κ³  νŠΉλ³„νžˆ μ§€μ •λ˜μ§€ μ•ŠμœΌλ©΄ λ³€μˆ˜κ°€ Null 값을 κ°€μ§ˆ 수 μ—†λ‹€. 

 

 

readline의 ν—€λ”λŠ” λ°˜ν™˜ νƒ€μž…μ΄ String? 인데, μ΄λŠ” ν•΄λ‹Ή νƒ€μž…μ΄ null κ°€λŠ₯함을 λ‚˜νƒ€λ‚Έλ‹€.

public fun readline(): String?

 

 

μ•„λž˜ μ½”λ“œλŠ” 였λ₯˜κ°€ λ‚˜μ§€ μ•ŠλŠ”λ‹€. 

fun main() {
    var beverage = readLine()
    beverage = null
    println(beverage)
}

 

null κ°€λŠ₯ νƒ€μž… - String?

null λΆˆκ°€λŠ₯ νƒ€μž… - String

 

 μ—λŸ¬ κ²€μΆœ μ‹œμ μ΄ 코틀린은 컴파일 μ—λŸ¬λ‘œ λž€λ‹€. μ΄λŠ” μž₯점. 

→ μ»΄νŒŒμΌλŸ¬κ°€ μ—λŸ¬λ₯Ό μž‘μ•„ μ£ΌλŠ”λ°, λ°˜λŒ€λ‘œ λŸ°νƒ€μž„ μ—λŸ¬λŠ” μ»΄νŒŒμΌλŸ¬κ°€ λ°œκ²¬ν•  수 μ—†μ–΄μ„œ ν”„λ‘œκ·Έλž¨μ΄ 컴파일된 수 μ‹€ν–‰ 쀑해 λ°œμƒν•œλ‹€. 

 

 

 

null μ•ˆμ „μ²˜λ¦¬.

 

μ•ˆμ „ 호좜 μ—°μ‚°μžλ‘œ μ—°μ†μ μœΌλ‘œ ν˜ΈμΆœν•˜κΈ°

beverage?.capitalize()?.plus(",large")

 

값이 null 일 λ•Œ μ‹€ν–‰λ˜λŠ”κ²Œ λ³΅μž‘ν•˜λ‹€λ©΄ if와 != μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄μ„œ null 검사λ₯Ό ν•œλ‹€.

// Null값을 μ•ˆμ „ν•˜κ²Œ μ²˜λ¦¬ν•˜λŠ” 3가지 방법
/**
 * 0. κ°€λŠ₯ν•œ ν•œ null λΆˆκ°€λŠ₯ νƒ€μž… μ‚¬μš©.
 * 1. μ•ˆμ „ 호좜 μ—°μ‚°μž - ?.
 * 2. μ•ˆμ „ 호좜 μ—°μ‚°μžμ™€ ν•¨κ»˜ let ν•¨μˆ˜ μ‚¬μš©ν•˜κΈ°
 * 3. non=null 단연 μ—°μ‚°μž
 * 4. 값이 null 인지 if 둜 κ²€μ‚¬ν•˜κΈ°
 * */
fun main() {
    // 1. μ•ˆμ „ 호좜 μ—°μ‚°μž - ?.
    // null 값을 κ²€μ‚¬ν•˜λŠ” μ½”λ“œλ₯Ό μžλ™μœΌλ‘œ μΆ”κ°€ν•΄μ€Œ. null 이 μ•„λ‹ˆλ©΄ capitalize 호좜/ null 이면 capitalize 호좜 μ•ˆν•˜κ³  κ·Έ λ‹€μŒ μ½”λ“œ μˆ˜ν–‰
    var beverage = readLine()?.capitalize()
    println(beverage)

    // 2. μ•ˆμ „ 호좜 μ—°μ‚°μžμ™€ ν•¨κ»˜ let ν•¨μˆ˜ μ‚¬μš©ν•˜κΈ°
    var beverage_1 = readLine()?.let {
        if(it.isNotBlank())
        {
            it.capitalize()
        }else{
            "λ§₯μ£Ό"
        }
    }
    println(beverage_1)


    // 3. non=null 단연 μ—°μ‚°μž !! -  이 μ—°μ‚°μžλŠ” μ ˆλŒ€ null이 μ•„λ‹ˆμ•Ό!
    var beverage_2 = readLine()!!.capitalize()
    println(beverage_2)


    // 4. 값이 null 인지 if 둜 κ²€μ‚¬ν•˜κΈ°
    var beverage_3 = readLine()
    if(beverage_3 != null){
        beverage_3 = beverage_3.capitalize()
    }else{
        println("Beverageκ°€ null μž…λ‹ˆλ‹€.")
    }
}

 

null 볡합 μ—°μ‚°μž - ?: (μ•¨λΉ„μŠ€ μ—°μ‚°μž)

→ μ™Όμͺ½ ν”Όμ—°μ‚°μžμ˜ κ²°κ³Όκ°€ null 이면 였λ₯Έμͺ½μ˜ ν”Όμ—°μ‚°μžλ₯Ό μ‹€ν–‰. null이 μ•„λ‹ˆλ©΄ μ™Όμͺ½ ν”Όμ—°μ‚°μžμ˜ κ²°κ³Ό λ°˜ν™˜.

 

var beverage_0 = readLine()
// beverage_0 값이 null이 μ•„λ‹ˆλ©΄ beverage_4에 κ·Έ 값이 μ €μž₯되고, null 이면 "λ§₯μ£Ό"κ°€ λ“€μ–΄κ°„λ‹€.
var beverage_4:String = beverage_0?:"λ§₯μ£Ό"
println(beverage_4)

 

μ˜ˆμ™Έμ²˜λ¦¬

1. null κ°€λŠ₯ μ •μˆ˜ νƒ€μž…μ˜ λ³€μˆ˜μ— null 둜 μ €μž₯ , swordsJuggling κ°’μœΌλ‘œ 좜λ ₯을 ν•˜λŠ” 것이 μœ„ν—˜ν•˜μ§€ μ•Šλ‹€. μ΄μœ λŠ” null 값이더라도 μ½˜μ†”λ‘œ 좜λ ₯ν•  수 있기 λ•Œλ¬Έ.

2. Throw ν‚€μ›Œλ“œλ‘œ μ˜ˆμ™Έ λ˜μ§€κΈ°

3. μ»€μŠ€ν…€ μ˜ˆμ™Έ μ •μ˜ν•˜κΈ°

4β˜…. try / catch - try 뢀뢄은 항상 μ‹€ν–‰. catch λŠ” μ˜ˆμ™Έκ°€ 생길 λ•Œλ§Œ 싀행됨.

 

μ „μ œ 쑰건 ν•¨μˆ˜

μ½”ν‹€λ¦°μ—μ„œλŠ” ν‘œμ€€ 라이브러리 μΌλΆ€λ‘œ 편의 ν•¨μˆ˜λ“€μ„ μ œκ³΅ν•œλ‹€. 이 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ μ»€μŠ€ν…€ λ©”μ‹œμ§€μ™€ 함계 μ˜ˆμ™Έλ₯Ό 던질 수 μžˆλ‹€. 

ex ) checkNotNull μ „μ œ 쑰건 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ 이 값이 Null인지 κ²€μ‚¬ν•œ ν›„ null 이 μ•„λ‹ˆλ©΄ κ·Έ 값을 λ°˜ν™˜. null이면 IllegalStateException λ°œμƒμ‹œν‚΄.

 

null 무엇이 μ’‹λ‚˜ ?

null 을 μ‚¬μš©ν•΄μ„œ μƒνƒœ λ‚˜νƒ€λ‚΄λŠ” 것은 ν”ν•˜λ‹€. μ‚¬λžŒλ„ λ””ν΄νŠΈ 이름은 μ—†μœΌλ‹ˆ.

 

checked μ˜ˆμ™Έ, unchecked μ˜ˆμ™Έ

λ‹€λ₯Έ μ–Έμ–΄μ˜ μ½”λ“œλ₯Ό 같이 μ‚¬μš©ν•  λ•Œμ˜ null 처리

: @Nonnull νƒ€μž…

 


λ¬Έμžμ—΄

https://www.androidhuman.com/2016-12-30-kotlin_string

 

 

substring

val indexOfAppstrophe = TAVERN_NAME.indexOf('\'')
val travernMaster = TAVERN_NAME.substring(0 until indexOfAppstrophe)

 

split (리슀트λ₯Ό λ°˜ν™˜ν•΄μ„œ "해체 μ„ μ–Έ" μ΄λΌλŠ” κ°„λ‹¨ν•œ 문법도 μ§€μ›ν•œλ‹€.)

val data = menuData.split(',')

 

 


숫자 νƒ€μž…

 

λ°˜μ‘ν˜•

λŒ“κΈ€