IMCAT.DEV
로그인 가입
Kotlin 중급 문법

Kotlin 고급 예외 처리

Kotlin 고급 예외 처리 — 중급

고급 예외 처리

1. 도입 (왜 배워야 하는가)

예외 처리는 소프트웨어 개발에서 필수적인 요소입니다. 실무에서는 예상치 못한 오류가 발생할 수 있으며, 이를 적절히 처리하지 않으면 프로그램이 중단되거나 사용자에게 불편을 초래할 수 있습니다. 예를 들어, 쇼핑몰에서 결제 시스템이 오류를 일으키면 고객이 장바구니를 비워버리거나 결제를 하지 못하는 상황이 발생할 수 있습니다. 이와 같은 문제를 피하기 위해 고급 예외 처리 기술을 습득하는 것이 중요합니다.

예외 처리를 잘못하면 프로그램의 안정성을 해칠 뿐만 아니라, 디버깅과 유지보수에도 큰 어려움을 겪게 됩니다. 따라서 고급 예외 처리 기법을 배우는 것은 안정적이고 신뢰할 수 있는 소프트웨어 개발의 기본입니다.

2. 핵심 개념 설명

예외(Exception)

예외는 프로그램 실행 중 발생하는 오류입니다. 예를 들어, 파일을 열려고 시도했지만 파일이 존재하지 않는 경우 발생하는 상황을 생각할 수 있습니다.

처리(Handling)

예외를 처리하는 방법으로는 try, catch, finally 블록을 사용합니다. 이는 마치 안전망을 설치해 사고를 미연에 방지하는 것과 비슷합니다.

용어설명
try예외가 발생할 수 있는 코드를 감싸는 블록.
catch발생한 예외를 처리하는 블록.
finally예외 발생 여부와 관계없이 항상 실행되는 블록.

3. 기본 코드 예제

다음은 기본적인 예외 처리를 보여주는 코드입니다.

fun main() {
    val number = "123a" // 숫자가 아닌 문자열
    try {
        val parsedNumber = number.toInt() // 예외 발생 가능성
        println("Parsed number: $parsedNumber")
    } catch (e: NumberFormatException) {
        println("유효하지 않은 숫자 형식입니다: ${e.message}") // 예외 처리
    } finally {
        println("예외 처리 종료") // 항상 실행되는 블록
    }
}

실행 결과:

유효하지 않은 숫자 형식입니다: For input string: "123a"
예외 처리 종료
  • val number = "123a": 숫자가 아닌 문자열을 정의합니다.
  • try 블록에 있는 number.toInt()에서 예외가 발생할 수 있습니다.
  • catch 블록에서 NumberFormatException을 잡아 오류 메시지를 출력합니다.
  • finally 블록은 예외 발생 여부와 관계없이 항상 실행됩니다.
  • 4. 실전 활용 예제

    예제 1: 파일 읽기

    쇼핑몰에서 제품 정보를 파일에서 읽어오는 경우를 생각해봅시다.

    import java.io.File
    import java.io.FileNotFoundException
    
    fun readProductFile(fileName: String) {
        try {
            val file = File(fileName)
            val content = file.readText()
            println("파일 내용: $content")
        } catch (e: FileNotFoundException) {
            println("파일을 찾을 수 없습니다: ${e.message}")
        } finally {
            println("파일 읽기 시도 완료")
        }
    }

    예제 2: 데이터베이스 연결

    데이터베이스에 연결할 때 발생할 수 있는 예외를 처리합니다.

    import java.sql.Connection
    import java.sql.DriverManager
    import java.sql.SQLException
    
    fun connectToDatabase(url: String) {
        try {
            val connection: Connection = DriverManager.getConnection(url)
            println("데이터베이스에 연결되었습니다.")
        } catch (e: SQLException) {
            println("데이터베이스 연결 실패: ${e.message}")
        } finally {
            println("연결 시도 완료")
        }
    }

    5. 흔한 실수와 주의사항

    실수 1: 예외를 무시하기

    try {
        val num = "abc".toInt()
    } catch (e: Exception) {
        // 예외 처리 없음
    }

    잘못된 코드: 예외를 무시하면 프로그램이 예기치 않게 종료될 수 있습니다.

    실수 2: finally 블록에 중요한 코드 넣기

    try {
        // 코드
    } finally {
        return // 잘못된 사용
    }

    올바른 코드: finally 블록에서 return을 사용하면 예외 발생 여부와 관계없이 메서드가 종료됩니다.

    6. 정리

  • 예외 처리는 프로그램의 안정성을 높이는 중요한 기술이다.
  • try, catch, finally를 사용해 예외를 적절히 처리할 수 있다.
  • 예외를 무시하거나 finally에서 return을 사용하는 것은 피해야 한다.
  • 다음에 학습하면 좋은 주제

  • 사용자 정의 예외 생성
  • 코틀린의 Result 타입 활용
  • 비동기 예외 처리 (Coroutine 사용)