초보 개발자의 성장기

[부스트코스] [부스트코스][코틀린 프로그래밍 기본 1/2] 한아아지와 함께하는 kotlin - 흐름 제어 (2) 프로그램 중단과 반환 그리고 예외 처리 본문

IT 강의 리뷰/코틀린

[부스트코스] [부스트코스][코틀린 프로그래밍 기본 1/2] 한아아지와 함께하는 kotlin - 흐름 제어 (2) 프로그램 중단과 반환 그리고 예외 처리

개발자 김케빈 2021. 1. 26. 00:19

이번 시간에는 프로그램 중단과 반환
그리고 예외 처리에 대해 공부해보겠습니다!


www.boostcourse.org/mo132/lecture/59984/

 

코틀린 프로그래밍 기본 1

부스트코스 무료 강의

www.boostcourse.org

www.boostcourse.org/mo132/lecture/77546

 

코틀린 프로그래밍 기본 1

부스트코스 무료 강의

www.boostcourse.org

www.boostcourse.org/mo132/lecture/65110

 

코틀린 프로그래밍 기본 1

부스트코스 무료 강의

www.boostcourse.org



1. 흐름 제어

1.1. return

  • 보통 return문은 함수 등에서 값을 반환하는데 사용합니다.
    하지만 코드의 흐름을 중단하고 함수등을 빠져 나가기 위해서도 return문을 사용할 수 있습니다.
  • 인라인(inline)으로 선언되지 않은 람다식 함수에서 return을 사용할 때는 그냥 사용할 수 없습니다.
    return@label과 같이 라벨(label) 표기와 함께 사용해야 합니다.
  • 라벨이란 코드에서 특정한 위치를 임의로 표시한 것으로@ 기호를 뒤에 이름을 붙여서 사용합니다.

return문 코드로 보기

fun add(a:Int, b: Int): Int {
	return a + b
    println("이 코드는 실행되지 않습니다.") // return문에서 종료되어 여기까지 도달되지 않음
}


// 1. Unit을 명시적으로 반환
fun hello(name: String): Unit {
	println(name)
    return Unit
}


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


// 3. rerurn 자체를 생략
fun hello(name: String) {
	println(name)
}


// 4. 람다식에서 return 사용하기
fun main() {
	retFunc()
}

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

fun retFunc() {
	println("start of retFunc") // (1)
    inlineLambda(13, 3) { a, b -> // (2)
    	val result = a + b
        if(result > 10) return // (3) 10보다 크면 이 함수를 빠져 나감
        println("result: $result")// (4) 10보다 크면 이 문장에 도달하지 못함
    }
    println("end of retFunc") // (5)
}


// 5. 람다식에서 라벨 사용
... (main 부분 위와 동일)

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 -> // (1) 람다식 블록의 시작 부분에 라벨을 지정함
    	val result = a + b
        if(result > 10) return@lit // (2) 라벨을 사용한 블록의 끝 부분으로 반환
        println("result: $result")
    } // (3)
    println("end of retFunc") // (4) 이 부분이 실행됨
}


// 6. 암묵적 라벨 
... (main, inlineLambda 위와 동일)

fun retFunc() {
	println("start of retFunc") 
    inlineLambda(13, 3) { a, b -> 
    	val result = a + b
        if(result > 10) return@inlineLambda 
        println("result: $result")
    }
    println("end of retFunc") 
}


// 7. 익명 함수의 사용
... (main, inlineLambda 위와 동일)

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") 
}

※ return을 사용한 다양한 방법이 존재하니 꼭 차이점을 확인해보시길 바랍니다!


1.2. Break와 Continue

break는 해당 키워드를 사용한 지점에서 for나 while, do...while문 루프를 빠져 나오게 됩니다.
continue는 이후 본문을 계속 진행하지 않고 다시 반복 조건을 살펴보게 됩니다.

 


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


fun labelBreak() {
    println("labelBreak")
    
    first@ for(i in 1..5) {
    
        second@ for (j in 1..5) {
            if (j == 3) break@first
            // 단순히 break를 사용한 경우 중첩되어 있는 두번째 for문이 중단되어 첫번째 for문의 조건으로 돌아감
            
            println("i:$i, j:$j")
        }
        
        println("after for j")
    }
    
    println("after for i")
} 


2. 예외처리

  • 프로그램 코드를 작성 중 해당 코드가 제대로 작동하지 못하고 중단되는 현상이 발생할 수 있습니다. 그것을 예외(exception)라고 합니다.
  • 대부분의 에러(error)는 코드를 작성하는 도중에 컴파일러가 잡아낼 수 있지만 비정상적으로 종류가 되는 경우
    컴파일러가 잡지 못하게 됩니다.
    ex) 운영체제의 문제, 입력 값의 문제, 받아들일 수 없는 연산,
         메모리의 할당 실패 및 연산 부족, 컴퓨터 기계 자체의 문제

예외처리는 다음과 같은 예외 처리 블록을 이용합니다.


try {
    예외 발생 가능성 있는 문장
    
} catch (e: 예외처리 클래스명) {
    예외를 처리하기 위한 문장
    
} finally {
   반드시 실행되어야 하는 문장
}

2.1. 예외처리 예시


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

2.2. 특정 예외 처리

산술 연산에 대한 예외를 따로 특정해서 잡으려면 ArithmeticException을 사용할 수 있습니다.
그밖에 다양한 예외처리 클래스가 있으므로 생각해볼 문제에서 찾아봅시다.


 - 스택의 추적

   예외 객체의 멤버인 printStackTrace( )를 사용하면 임시 메모리 영역인 스택을 추적할 수 있습니다.

 - 특정 조건에 따른 예외 발생
    throw Exception(message: String)

 


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


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

 

 

Comments