[TIL] 2023. 12. 08

Gahyeon Lee·2023년 12월 8일
0

TIL

목록 보기
20/47

🍥 예외처리

1. 예외처리의 활용

  • 프로그램을 실행하기전에 알 수 있는 컴파일 에러를 오류라고 한다.
  • 프로그램을 실행하는 도중에 발생하는 런타임 에러는 예외라고 한다.
  • 실행도중에 예외가 발생하면 프로그램이 비정상적으로 종료되니 적절한 처리가 필요하다.
  • 예외가 발생했을 때 안정적으로 로그를 남기거나, 처리를 하고 싶으면 throw 구조보다 try-catch 구조를 써야 한다.

2. Kotlin의 예외처리 방법

▶️ try-catch의 구조

fun method1() {
		try {
			예외가 발생할 가능성이 존재하는 코드
		} catch(예외종류) {
			예외가 발생했을때 처리할 코드(종료하지말고 이 코드를 대신 실행해)
		}
}

▶️ throw의 구조

fun method1(num1:Int) {
		if(num1 > 10) {
			throw 예외종류	// 예외가 발생했을 때 어떤 처리를 하는 건 아니고, 예외를 던지기만 해서 예외가 발생했을 때 비정상 종료되지만 않게 안정적이게 하는 역할
		}						
}

3. 예외처리의 필요성

  • 고품질의 프로그램이란 사용성을 해치지 않아야 한다.
  • 여러 측면의 사용성이 있지만 프로그램이 도중에 종료되는건 심각한 문제이다.
  • 미리 예외를 생각하고 소스코드를 작성해야 안정성을 높인 프로그램이라고 할 수 있다.

< 예시 >

  • 숫자를 입력받아서 더하는 프로그램인데 실수로 문자를 입력했다면 예외를 처리해야 한다.
  • 사진을 다운로드 받는데 도중에 인터넷이 끊긴다면 예외를 처리해야 한다.
  • 수술을 받고있는데 메인 전력이 끊겼다면 보조 전력을 사용하도록 예외를 처리해야 한다.

4. 예시 코드

숫자를 입력해야하는데 실수로 문자를 입력했을때의 예외를 처리해 보자.
▶️ 예외 시 발생한 오류 화면

▶️ 예외를 처리한 상황 (try-catch)

  • 입력한 내용을 toInt메소드로 정수 변환할때 예외가 발생한다.
  • 숫자를 입력할때까지 반복문을 무한으로 실행하는 코드이다.
  • break는 가장 가까운 반복문을 탈출하는 키워드이다.
fun main() {
    while(true) {                      // while(true)는 break 나올 때까지는 무한루프되는 반복문
        try {
            var num1 = readLine()!!.toInt()
            println("내가 입력한 숫자는 ${num1}입니다")
            break                      // 제대로 입력하면 가장 가까운 반복문인 while문에서 탈출
        } catch(e:java.lang.NumberFormatException) {
            println("숫자를 입력하세요")    // 제대로 입력하지 않고 예외가 발생되면 예외(catch)로 떨어져서 제대로 입력할 때까지 반복문을 돌며 숫자를 입력하라고 함
        }
    }
}

▶️ 예외를 처리한 상황 (try-catch-finally)

  • 예외 처리와 관계없이 항상 실행하는 코드를 finally에 작성한다.
  • 실제 예시
    • USB와 연결하는 코드는 반드시 사용 후에 연결을 끊어야 한다. (자원낭비) : USB 연결하는 도중에 연결이 끊겼을 때를 처리하기 위한 예외처리를 했는데, 만약 잘 연결이 됐다 하더라도 USB를 할당하지 않으면 계속 메모리에 남게 되는 자원낭비가 된다. 그 자원낭비를 방지하기 위해 쓴다. ❓
    • GPS를 사용하는 코드는 반드시 사용 후에 연결을 끊어야 한다. (자원낭비)
fun main() {
    while(true) {
        try {
            var num1 = readLine()!!.toInt()
            println("내가 입력한 숫자는 ${num1}입니다")
            break
        } catch(e:java.lang.NumberFormatException) {
            println("숫자를 입력하세요")
        } finally {                             // try, catch와 상관없이 항상 실행됨
            println("키보드와의 연결은 정상적입니다")
        }
    }
}
profile
코린이 강아지 집사🐶

0개의 댓글