IMCAT.DEV
로그인 가입
Scala 입문 문법

Scala 예외 처리 기초

Scala 예외 처리 기초 — 초급

예외 처리 기초

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

예외 처리는 프로그램이 예상치 못한 상황에 대처할 수 있게 해주는 중요한 기법입니다. 실무에서는 시스템이 안정적으로 작동해야 하며, 사용자에게 원활한 경험을 제공해야 합니다. 예를 들어, 쇼핑몰 웹사이트에서 사용자가 결제를 시도할 때, 서버 오류나 네트워크 문제로 인해 결제가 실패할 수 있습니다. 이러한 오류를 적절히 처리하지 않으면 사용자는 혼란을 느끼고, 이는 회사의 신뢰도 저하로 이어질 수 있습니다. 예외 처리를 통해 프로그램의 예외적인 상황을 다루지 않으면, 프로그램이 중단되거나 잘못된 결과를 초래할 수 있습니다.

2. 핵심 개념 설명

예외 처리의 기본 개념은 프로그램 실행 중 발생할 수 있는 오류를 인식하고, 이에 대해 적절한 대응을 하는 것입니다.

  • 예외(Exception): 프로그램 실행 중 발생하는 오류를 의미합니다. 예를 들어, 배열의 인덱스 범위를 초과하는 경우가 이에 해당합니다.
  • try-catch 블록: 예외를 처리하기 위해 사용하는 구조입니다. try 블록에서 예외가 발생하면, 해당 예외를 catch 블록에서 처리합니다.
  • finally 블록: 예외 발생 여부와 관계없이 항상 실행되는 코드 블록입니다. 자원을 정리할 때 유용합니다.
  • 용어설명
    Exception프로그램 실행 중 발생하는 오류
    try예외를 감지하고 처리할 코드
    catch예외 발생 시 실행할 코드
    finally항상 실행되는 코드

    3. 기본 코드 예제

    다음은 Scala에서 예외 처리를 사용하는 기본적인 예제입니다.

    object ExceptionHandlingExample {
      def divide(x: Int, y: Int): Int = {
        try {
          x / y  // y가 0이면 예외 발생
        } catch {
          case e: ArithmeticException => 
            println("0으로 나눌 수 없습니다!") // 예외 처리
            0  // 기본값 반환
        }
      }
    
      def main(args: Array[String]): Unit = {
        println(divide(10, 2)) // 정상적인 경우
        println(divide(10, 0)) // 예외가 발생하는 경우
      }
    }

    실행 결과

    5
    0으로 나눌 수 없습니다!
    0

    코드 한 줄씩 동작 설명

    1. divide 함수가 두 개의 정수를 인자로 받습니다.
    2. try 블록에서 x / y를 실행합니다. 만약 y가 0이라면 ArithmeticException이 발생합니다.
    3. 예외가 발생하면 catch 블록이 실행되어 오류 메시지를 출력합니다.
    4. 0을 반환하여 함수 호출이 종료됩니다.
    5. main 함수에서 두 번의 divide 호출이 이루어집니다.
    6. 4. 실전 활용 예제

      예제 1: 파일 읽기

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

      import scala.io.Source
      import java.io.FileNotFoundException
      
      def readFile(filename: String): String = {
        try {
          Source.fromFile(filename).getLines().mkString("\n")
        } catch {
          case e: FileNotFoundException => 
            println(s"파일을 찾을 수 없습니다: $filename")
            ""
        }
      }

      예제 2: 사용자 입력 처리

      사용자가 입력한 숫자를 처리하는 예제입니다.

      def getUserInput(): Int = {
        try {
          println("숫자를 입력하세요:")
          scala.io.StdIn.readInt()
        } catch {
          case e: NumberFormatException => 
            println("잘못된 입력입니다. 숫자를 입력하세요.")
            0
        }
      }

      위의 두 예제에서는 각각 파일을 읽는 과정과 사용자 입력을 처리하는 과정에서 발생할 수 있는 예외를 처리하고 있습니다.

      5. 흔한 실수와 주의사항

    7. 예외를 무시하는 것: 예외를 처리하지 않으면 프로그램이 갑자기 중단될 수 있습니다. 예외는 반드시 처리해야 합니다.
    8. - 잘못된 코드:

          def dangerousMethod() = {
            val result = 1 / 0 // 예외가 발생하지만 처리하지 않음
          }

      - 올바른 코드:

          def safeMethod() = {
            try {
              1 / 0
            } catch {
              case e: ArithmeticException => println("예외 발생")
            }
          }
    9. 모든 예외를 포괄적으로 처리하는 것: 너무 일반적인 예외 처리로 인해 문제가 숨겨질 수 있습니다.
    10. - 잘못된 코드:

          try {
            // 위험한 코드
          } catch {
            case _: Exception => println("오류 발생") // 모든 예외를 잡음
          }

      - 올바른 코드:

          try {
            // 위험한 코드
          } catch {
            case e: SpecificException => println("특정 오류 처리")
            case e: AnotherException => println("다른 오류 처리")
          }

      6. 정리

    11. 예외 처리는 프로그램의 안정성을 높이는 데 필수적입니다.
    12. try-catch 블록을 사용하여 예외를 효과적으로 처리할 수 있습니다.
    13. finally 블록을 사용하여 자원 정리를 할 수 있습니다.
    14. 실무에서 파일 읽기, 사용자 입력 처리 등에서 예외 처리는 매우 중요합니다.

다음에 학습하면 좋은 주제는 사용자 정의 예외 처리와 Future와 비동기 프로그래밍입니다.