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

Scala 에러 처리 심화

Scala 에러 처리 심화 — 중급

에러 처리 심화

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

에러 처리는 소프트웨어 개발에서 매우 중요한 단계입니다. 코드가 예상대로 작동하지 않는 경우, 이를 적절히 처리하지 않으면 프로그램이 비정상적으로 종료되거나 사용자가 혼란스러워 할 수 있습니다. 특히 실무에서는 다양한 외부 요인(네트워크 오류, 파일 입출력 문제 등)으로 인해 에러가 발생할 수 있기 때문에, 체계적인 에러 처리가 필수적입니다. 에러 처리를 제대로 하지 않으면 불필요한 시간과 비용이 발생할 수 있으며, 사용자 경험을 저하시킬 수도 있습니다.

2. 핵심 개념 설명

에러 처리에 대한 몇 가지 핵심 개념은 다음과 같습니다:

  • 예외(Exception): 프로그램 실행 중 발생할 수 있는 에러를 의미합니다. 예를 들어, 사용자가 존재하지 않는 파일을 열려고 시도할 때 발생하는 에러입니다.
  • 잡기(Catch): 발생한 예외를 처리하는 코드 블록입니다. 예외가 발생했을 때 어떤 조치를 취할지를 정의합니다.
  • 던지기(Throw): 예외를 발생시키는 행위로, 특정 조건이 충족되지 않을 때 사용합니다.
  • 용어설명
    예외코드 실행 중 발생하는 에러
    잡기발생한 예외를 처리하는 코드 블록
    던지기예외를 발생시키는 행위

    3. 기본 코드 예제

    아래의 코드는 Scala에서 예외를 처리하는 기본적인 방법을 보여줍니다.

    object ExceptionHandlingExample {
      def divide(a: Int, b: Int): Int = {
        try {
          a / b // b가 0일 경우 예외 발생
        } catch {
          case e: ArithmeticException => 
            println("0으로 나눌 수 없습니다.")
            0 // 기본값으로 0 반환
        }
      }
    
      def main(args: Array[String]): Unit = {
        println(divide(10, 2)) // 5
        println(divide(10, 0)) // 0
      }
    }

    실행 결과:

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

    코드 한 줄씩 동작 설명:

    1. divide 함수는 두 개의 정수를 입력받고 나누기를 시도합니다.
    2. try 블록 내에서 a / b를 시도합니다.
    3. 만약 b가 0이라면 ArithmeticException이 발생하고, catch 블록이 실행됩니다.
    4. 에러 메시지를 출력하고, 기본값인 0을 반환합니다.
    5. main 함수에서 divide 함수를 호출하고 결과를 출력합니다.
    6. 4. 실전 활용 예제

    7. 쇼핑몰에서 장바구니 구현
    8. - 사용자가 장바구니에 상품을 추가할 때, 재고가 부족할 경우 예외를 처리합니다.

      class Product(val name: String, var stock: Int)
      
      class ShoppingCart {
        private var items: List[Product] = List()
      
        def addItem(product: Product): Unit = {
          if (product.stock <= 0) {
            throw new IllegalArgumentException(s"${product.name}는 재고가 없습니다.")
          }
          items = product :: items
          product.stock -= 1
        }
      }
      
      object ShoppingCartExample {
        def main(args: Array[String]): Unit = {
          val product = new Product("사과", 0)
          val cart = new ShoppingCart()
      
          try {
            cart.addItem(product) // 재고가 없으므로 예외 발생
          } catch {
            case e: IllegalArgumentException => println(e.getMessage)
          }
        }
      }
    9. 파일 읽기
    10. - 파일을 읽는 동안 발생할 수 있는 예외를 처리합니다.

      import scala.io.Source
      
      object FileReadingExample {
        def readFile(filename: String): String = {
          try {
            Source.fromFile(filename).getLines().mkString("\n")
          } catch {
            case e: java.io.FileNotFoundException => 
              "파일을 찾을 수 없습니다."
          }
        }
      
        def main(args: Array[String]): Unit = {
          println(readFile("nonexistent_file.txt")) // 파일을 찾을 수 없습니다.
        }
      }

      5. 흔한 실수와 주의사항

    11. 예외를 잡지 않고 무시하기
    12. - 잘못된 코드:

         try {
           a / b
         } // 예외 처리 없음

      - 올바른 코드:

         try {
           a / b
         } catch {
           case _: ArithmeticException => println("0으로 나눌 수 없습니다.")
         }
    13. 모든 예외를 한 곳에서 처리하기
    14. - 잘못된 코드:

         try {
           // 여러 다른 코드
         } catch {
           case e: Exception => println("에러 발생")
         }

      - 올바른 코드:

         try {
           // 특정 코드
         } catch {
           case e: ArithmeticException => println("산술 에러")
           case e: FileNotFoundException => println("파일이 없음")
         }

      6. 정리

    15. 에러 처리는 프로그램 안정성을 높이고 사용자 경험을 개선합니다.
    16. try, catch, throw 키워드를 사용하여 예외를 처리할 수 있습니다.
    17. 발생할 수 있는 다양한 예외를 구체적으로 처리하는 것이 중요합니다.
    18. 다음에 학습하면 좋은 주제로는 비동기 프로그래밍과 에러 로깅이 있습니다.