본문 바로가기
Boost Course

[코틀린 프로그래밍 기본 1] 5장 프로그램의 흐름을 제어해 보자

by kldaji 2021. 7. 19.

 

 

5-1 조건문을 통한 분기 (1)

1) 조건문을 통한 변수 선언

fun main() {
    val number = 1
    val result = if (number > 0)
        "양수 값" // 마지막 값이 할당 값
    else if (number < 0)
        "음수 값"
    else
        "0"

    println(result)
}

 

2) 조건문

fun main() {
    print("Enter the score : ")
    val score = readLine()!!.toDouble()

    if (score > 90.0){
        println("A")
    }
    else if (score >= 80.0 && score <= 90.0){ // score in 80.0..90.0
        println("B")
    }else{
        println("C")
    }
}

 

 

 

5-1 조건문을 통한 분기 (2)

1) 인자가 있는 when

fun main() {
    print("Enter the score : ")
    val score = readLine()!!.toDouble()

    when(score){
        in 90.0..100.0 -> println("A")
        in 80.0..90.0 -> println("B")
        else -> println("C")
    }
}

 

2) 인자가 없는 when

fun main() {
    print("Enter the score : ")
    val score = readLine()!!.toDouble()

    when{
        score >= 90.0 -> println("A")
        score in 80.0..90.0 -> println("B")
        else -> println("C")
    }
}

 

 

5-2 반복문으로 여러번!

1) for문

fun main() {
    for(x in 1..5){
        println(x)
    }

    for(x in 5 downTo 1){
        println(x)
    }

    for(x in 1..5 step 2){
        println(x)
    }

    for(x in 5 downTo 1 step 2){
        println(x)
    }
}

2) while문

fun main() {
    print("Enter the number : ")
    var number = readLine()!!.toInt()
    var factorial: Long = 1

    while(number > 0){
        factorial *= number
        number--
    }

    println(factorial)
}

3) do-while문

fun main() {
    do{
        print("Enter the number : ")
        var input = readLine()!!.toInt()

        for(i in 0 until input){ // input은 범위에 포함되지 않는다.
            for(j in 0 until input){
                print((i+j)%input + 1)
            }
            println()
        }
    }while(input != 0)
}

 

 

5-3 흐름의 중단과 반환 (1)

1) 비지역 반환의 예

fun main() {
    retFunc()
}

inline fun inlineLambda(a: Int, b: Int, out: (Int, Int) -> Unit){
    out(a, b)
}

fun retFunc(){
    println("Start of Func")

    inlineLambda(12, 3) { a, b ->
        val result = a + b
        if (result > 10) return // 비지역 반환
        println("result : $result")
    }

    println("End of Func")
}

2) 비지역 반환을 방지하기 위한 라벨링

fun main() {
    retFunc()
}

inline fun inlineLambda(a: Int, b: Int, out: (Int, Int) -> Unit){
    out(a, b)
}

fun retFunc(){
    println("Start of Func")

    inlineLambda(12, 3) lit@{ a, b ->
        val result = a + b
        if (result > 10) return@lit // 라벨링
        println("result : $result")
    }

    println("End of Func")
}

 

5-3 흐름의 중단과 반환 (2)

1) 암묵적 라벨링 

fun main() {
    retFunc()
}

inline fun inlineLambda(a: Int, b: Int, out: (Int, Int) -> Unit) {
    out(a, b)
}

fun retFunc() {
    println("Start of Func")
    inlineLambda(12, 3) { a, b ->
        val result = a + b
        if (result > 10) return@inlineLambda // 암묵적 라벨링
        println("result : $result")
    }
    println("End of Func")
}

2) 일반 익명 함수

- 비지역 반환이 없다는 장점

fun main() {
    retFunc()
}

inline fun inlineLambda(a: Int, b: Int, out: (Int, Int) -> Unit){
    out(a, b)
}

fun retFunc(){
    println("Start of Func")

    inlineLambda(12, 3, fun (a, b) { // 일반 익명 함수
        val result = a + b
        if (result > 10) return
        println("result $result")
    })

    println("End of Func")
}

3) 람다식과 익명 함수 비교

fun main() {
    val getMessage = lambda@ { num: Int ->
        if (num !in 1..100){
            return@lambda "Error" // return
        }
        "Success" // return
    }
    val result = getMessage(101)
    println("result : $result")
}
fun main() {
    val getMessage = fun(num: Int): String {
        if (num !in 1..100) {
            return "Error"
        }
        return "Success"
    }
    val result = getMessage(101)
    println("result : $result")
}

4) break 라벨링

fun main() {
    first@ for(i in 1..5){
        second@ for(j in 1..5){
            if (j == 3) break@first
            println("i : $i, j : $j")
        }
    }
}

 

5-4 예외가 발생했어요!

1) try catch 구문

fun main() {
    val a = 6
    val b = 0
    val c: Int
    try{
        c = a / b
    } catch (e: Exception){
        println(e)
    } finally {
        println("finally")
    }
}

2) 예외 발생시키기

import java.lang.Exception

fun main() {
    var amount = 600
    try {
        amount -= 100
        checkAmount(amount)
    } catch (e: Exception) {
        println(e.message)
    }
}

fun checkAmount(amount: Int) {
    if (amount < 1000) {
        throw Exception("잔고가 $amount 으로 1000 이하입니다.")
    }
}