[코틀린 스터디13]0718

ssook·2021년 7월 17일
0
post-thumbnail

✅ 흐름제어

  • 흐름 제어문
  1. return : 함수에서 결괏값을 반환하거나 지정된 라벨로 이동
  2. break : for이나 while의 조건식에 상관없이 반복문을 끝냄
  3. continue : for이나 while의 반복문 본문을 모두 수행하지 않고 다시 조건으로 넘어감
  • 예외 처리문
  1. try {...} catch {...} : try 블록의 본문을 수행하는 도중 예외가 발생하면 catch 블록의 본문을 실행
  2. try{...} catch {...} finally {...} : 예외가 발생해도 finally 블록 본문은 항상 실행
  • return으로 Unit 반환하기
//1. Unit을 명식적으로 반환
fun hello(name: String) : Unit {
	println(name)
    return Unit
}

//2. Unit 이름을 생략한 반환
fun hello(name: String): Unit {
	println(name)
    return
}

//3. return문 자체를 생략
fun hello(name: String) {
	println(name)
}
  • 람다식에서 return 사용하기
fun main(){
	retFunc()
}

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

fun retFunc() {
    println("start of retFunc")
    inlineLambda(13, 3) { a, b -> 
        val result = a + b
        if(result > 10) return // 비지역 반환
        println("result: $result")
    } 
    println("end of retFunc") 
}
  • 람다식에서 라벨 사용

람다식 함수명 라벨이름@{
...
return@라벨이름
}

fun main(){
	retFunc()
}

fun inlineLambda(a: Int, b: Int, out: (Int, Int) -> Unit) { // inline이 제거됨
    out(a, b)
}

fun retFunc() {
    println("start of retFunc")
    inlineLambda(13, 3) lit@{ a, b ->  // ① 람다식 블록의 시작 부분에 라벨을 지정함
        val result = a + b
        if(result > 10) return@lit 
        // ② 라벨을 사용한 블록의 끝부분으로 반환
        println("result: $result")
    } // ③ 이 부분으로 빠져나간다
    println("end of retFunc") //  ④ 이 부분이 실행됨 
}
  • 암묵적 라벨
    람다식 표현식 블록에 직접 라벨을 쓰는 것이 아닌 람다식 함수의 명칭을 그대로 라벨처럼 사용할 수 있음.
fun retFunc() {
    println("start of retFunc")
    inlineLambda(13, 3) { a, b -> //직접 라벨 사용 X
        val result = a + b
        if(result > 10) return@inlineLambda //암묵적 라벨 
        println("result: $result")
    } 
    println("end of retFunc") 
}

✅ 익명함수를 사용한 반환

  • 익명함수의 사용
    : 람다식 함수 표현식 대신에 익명 함수를 넣는 방법.
    이때 익명함수 내부에서 라벨을 사용하지 않고 단순히 return만 사용하더라도 비지역 반환이 일어나지 않음.
    → 따라서 일반 함수의 반환처럼 편하게 사용 가능
fun retFunc() {
    println("start of retFunc")
    inlineLambda(13, 3, fun (a,b) { 
        val result = a + b
        if(result > 10) return
        println("result: $result")
    }) // inlineLambda() 함수의 끝 
    println("end of retFunc") 
}
  • 람다식과 익명 함수의 사용
  1. 람다식 방법
val getMessage = lambda@{
	num: Int -> 
    if(num !in 1..100) {
    	return@lambda "Error" //라벨을 통한 반환
    }
    "Success"
}
  1. 익명 함수 방법
val getMessage = fun(num: Int): String{
	if(num !in 1..100){
    	return "Error"
    }
    return "Success"
}
val result = getMessage(99)

✅ break와 continue

  • break와 continue
    : for나 while, do...while 문 루프를 빠져 나옴
    : break는 해당 반복문을 중단, continue는 해당 반복문의 처음으로 이동
fun main(){
	for(i in 1..5){
    	if (i==3) break
        print(i)
    }
    println() //개행문자
    println("outside")
}

출력결과
12
outside

➕ break를 continue로 바꾸면?

1245
outside

✅ break와 라벨 함께 사용하기

  • break와 함께 라벨을 사용해 중단되는 위치를 바꿀 수 있게 함
fun labelBreak() {
    println("labelBreak")
    for(i in 1..5) {
        second@ for (j in 1..5) {
            if (j == 3) break
            println("i:$i, j:$j")
        }
        println("after for j")
    }
    println("after for i")
} 

위의 경우 중첩된 for문이 중단되어 첫번째 for문의 조건으로 이동함

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

break@first와 같이 라벨을 사용할 때는 첫번째 for문 블록 자체를 빠져나가게 된다.

profile
개발자에서, IT Business 담당자로. BrSE 업무를 수행하고 있습니다.

0개의 댓글