๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์–ธ์–ด/Kotlin

[Kotlin ๋ฌธ๋ฒ• ์ข…ํ•ฉ] - ๋„ ์„ธ์ดํ”„ํ‹ฐ @@์ˆ˜์ •ํ•˜๊ธฐ

by ์ ผ์ ผ39 2024. 3. 6.

1. ๋„ ์„ธ์ดํ”„ํ‹ฐ

    : Null ์˜ˆ์™ธ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•œ ์„ค๊ณ„๋ฅผ ์œ„ํ•ด ์ž๋ฃŒํ˜•์— Null ์—ฌ๋ถ€๋ฅผ ๋ช…์‹œ

  •     ?, !!, ?. , ?:

 

1) ?    null ํ• ๋‹น ํ—ˆ์šฉ ๊ธฐํ˜ธ

    * null ํ—ˆ์šฉ ์—ฌ๋ถ€์— ๋”ฐ๋ผ String๊ณผ String? ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์ž๋ฃŒํ˜•์ž„

    // null์„ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ์„ค๊ณ„ํ•˜๋ ค๋ฉด lateinit var ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Œ
                    <-- ์ด๋Ÿฌ๋ฉด ๋‚˜์ค‘์— null ๊ฒ€์‚ฌ ์•ˆํ•ด๋„ ๋จ. ์ดˆ๊ธฐํ™”ํ• ๊ฑฐ๋ผ๊ณ  ๋ณด์žฅํ•˜๋Š”๊ฑฐ๋‹ˆ๊นŒ.

fun main(){
    var s = Student()
    s.name = "์ฐธ์ƒˆ"
    s.address = "์„œ์šธ"
    s.displayInfo()
}

class Student {
    lateinit var name:String
    var address:String? = null 			//null ์ €์žฅ
    
    fun displayInfo() {
        println("์ด๋ฆ„์€: ${name} ์ž…๋‹ˆ๋‹ค")
        println("์ฃผ์†Œ๋Š”: ${address} ์ž…๋‹ˆ๋‹ค")
    }
}

 

2) !!    non-null ๋‹จ์ • ๊ธฐํ˜ธ

    * ๊ฐ•์ œ๋กœ null์ด ์•„๋‹ˆ๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ. (์‚ฌ์šฉ ์ง€์–‘ํ•  ๊ฒƒ)

    //null์ด ์žˆ์–ด๋„ ์ปดํŒŒ์ผ์€ ์ง„ํ–‰๋˜๋‚˜ ์‹คํ–‰ ์ค‘ ์˜ˆ์™ธ ์˜ค๋ฅ˜ ๋ฐœ์ƒ...

fun main(){
//  var data = readLine()!!.toInt() 		//์ด๋ ‡๊ฒŒ ํ•œ์ค„๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜๋„ ์žˆ์Œ

    var inputData = readLine()!! 		//readLine ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์‹œ์˜ ๋ฆฌํ„ด๊ฐ’์ด null์ด ์•„๋‹˜์„ ๋ณด์žฅ
    var data = inputData.toInt() 		//์—ฌ๊ธฐ์„  null ์ฒดํฌ๋ฅผ ํ•˜์ง€ ์•Š์Œ. ์œ„์—์„œ ๋ณด์žฅํ•˜๋‹ˆ๊นŒ!
    println("Null์•„๋‹Œ ๊ฐ’: ${data}")
}

3) ?.  ์•ˆ์ „ ํ˜ธ์ถœ์—ฐ์‚ฐ์ž, ์„ธ์ดํ”„ ์ฝœ

    : null์ด ํ• ๋‹น๋˜์–ด์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ๊ฒ€์‚ฌ, ์•ˆ์ „ํ•˜๊ฒŒ ํ˜ธ์ถœ. null์ด๋ฉด ์ ‘๊ทผ X 

fun main(){
    var s = Student()
    s.name = "์ฐธ์ƒˆ" 		//์ด ๋‹จ๊ณ„์—์„œ address๋Š” null์ž„
    s.displayAddressLength()
    
    s.address = "์„œ์šธ" 		//์—ฌ๊ธฐ์—์„œ address๊ฐ€ ๋ฐ”๋€œ
    s.displayInfo()
}

class Student {
    lateinit var name:String
    var address:String? = null

    fun displayInfo() {
        println("์ด๋ฆ„์€: ${name} ์ž…๋‹ˆ๋‹ค")
        println("์ฃผ์†Œ๋Š”: ${address} ์ž…๋‹ˆ๋‹ค")
    }
    
    fun displayAddressLength() {
        println("์ฃผ์†Œ์˜ ๊ธธ์ด๋Š”: ${address?.length} ์ž…๋‹ˆ๋‹ค") 		//null์ด๋ฉด ํ˜ธ์ถœ๋˜์ง€ ์•Š์Œ
    }
}

4) ?:    ์—˜๋น„์Šค ์—ฐ์‚ฐ์ž

    : ๋ณ€์ˆ˜๊ฐ€ null์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌ, null์ด ์•„๋‹ˆ๋ฉด ์ขŒ์ธก ์‹์„, null์ด๋ฉด ์šฐ์ธก ์‹ ์‹คํ–‰  

fun main(){
    var s = Student()
    s.name = "์ฐธ์ƒˆ"
    s.displayAddressLength()

    s.address = "์„œ์šธ"
    s.displayInfo()
}

class Student {
    lateinit var name:String
    var address:String? = null

    fun displayInfo() {
        println("์ด๋ฆ„์€: ${name} ์ž…๋‹ˆ๋‹ค")
        println("์ฃผ์†Œ๋Š”: ${address} ์ž…๋‹ˆ๋‹ค")
    }
    
    fun displayAddressLength() {
        println("์ฃผ์†Œ์˜ ๊ธธ์ด๋Š”: ${address?.length ?: "์ดˆ๊ธฐํ™”ํ•˜์„ธ์š”"} ์ž…๋‹ˆ๋‹ค")
        //?.length๋กœ ํ•œ๋ฒˆ ๊ฒ€์‚ฌ๋ฅผ ํ•˜๋Š”๋ฐ ๊ทธ ๋’ค์— ?:๋กœ ์–ด๋–ค๊ฑธ ๋ฆฌํ„ดํ• ์ง€ ๊ฒฐ์ •
    }
}

 

 

2. ํ™œ์šฉ

fun main() {
    val worldName = "์Šค์ฝ”์›”๋“œ"

    var myName = inputMyInfo("name").toString() 		//" " ์•ˆ์— ์ข…๋ฅ˜ ๋„ฃ์–ด์ฃผ๊ธฐ
    var myAge = inputMyInfo("age").toString().toInt() 		//๋ฐ‘์—์„œ ๋ฆฌํ„ด๊ฐ’์ด ์ˆซ์ž๋ผ์„œ .toString().toInt()  
	var myJob = inputMyInfo("job").toString()

    var isNamePass = true
    var names = arrayOf("์ฐธ์ƒˆ", "๊ฟฉ", "๋น„๋‘˜๊ธฐ")
    for(name in names) {
        if(myName == name) {
            println("์ค‘๋ณต๋œ ์ด๋ฆ„์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.")
            isNamePass = false 						//๋ฐ‘์—์„œ && ์ด์šฉํ•ด ๋‹ค ๋งŒ์กฑ ์‹œ์—๋งŒ ๋„˜์–ด๊ฐ€๊ฒŒ
            break
        }
    }

fun inputMyInfo(type:String): Any? { 		//๋ชจ๋“  ํƒ€์ž… ๋˜๋Š” null์„ ๋ฐ˜ํ™˜ ๊ฐ€๋Šฅ
    return when(type) {
        "name" -> {
            println("์ด๋ฆ„์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”")
            while(true) {
                try {
                    var originName = readLine()
                    if(originName?.first() != '_' && originName?.first() != '!') { 		//.first()๋Š” ์ฒซ๋ฒˆ์งธ ์ธ์ž ๋ฐ˜ํ™˜
                        return originName
                    } else {
                        println("์ด๋ฆ„์„ ๋‹ค์‹œ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”")
                    }
                } catch(e:Exception) { 						//์˜ˆ์™ธ์ฒ˜๋ฆฌ
                    println("์ด๋ฆ„์„ ๋‹ค์‹œ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”")
                }
            }
        }
        "age" -> {
            println("๋‚˜์ด๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”")
            while(true) {
                try {
                    var originAge:String? = readLine()
                    return originAge?.toInt() ?: -1 			//originAge๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด .toInt()๊ฐ’ ๋ฆฌํ„ด, ์•„๋‹˜ -1๋ฆฌํ„ด
                } catch(e:Exception) {
                    println("๋‚˜์ด๋ฅผ ๋‹ค์‹œ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”")
                }
            }
        }
        "job" -> {
            println("์ง์—…์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”")
            while(true) {
                try {
                    var originName = readLine()
                    if(originName?.equals("๊ถ์ˆ˜") == true || originName?.equals("๋งˆ๋ฒ•์‚ฌ") == true) {
                        return originName
                    } else {
                        println("์ง์—…์„ ๋‹ค์‹œ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”")
                    }
                } catch(e:Exception) {
                    println("์ง์—…์„ ๋‹ค์‹œ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”")
                }
            }
        }
        else -> {
            return "no"
        }
    }
}