학습
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
코드 한 줄씩 동작 설명:
divide함수는 두 개의 정수를 입력받고 나누기를 시도합니다.try블록 내에서a / b를 시도합니다.- 만약
b가 0이라면ArithmeticException이 발생하고,catch블록이 실행됩니다. - 에러 메시지를 출력하고, 기본값인 0을 반환합니다.
main함수에서divide함수를 호출하고 결과를 출력합니다.- 쇼핑몰에서 장바구니 구현
- 파일 읽기
- 예외를 잡지 않고 무시하기
- 모든 예외를 한 곳에서 처리하기
- 에러 처리는 프로그램 안정성을 높이고 사용자 경험을 개선합니다.
try,catch,throw키워드를 사용하여 예외를 처리할 수 있습니다.- 발생할 수 있는 다양한 예외를 구체적으로 처리하는 것이 중요합니다.
- 다음에 학습하면 좋은 주제로는 비동기 프로그래밍과 에러 로깅이 있습니다.
4. 실전 활용 예제
- 사용자가 장바구니에 상품을 추가할 때, 재고가 부족할 경우 예외를 처리합니다.
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)
}
}
}
- 파일을 읽는 동안 발생할 수 있는 예외를 처리합니다.
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. 흔한 실수와 주의사항
- 잘못된 코드:
try {
a / b
} // 예외 처리 없음
- 올바른 코드:
try {
a / b
} catch {
case _: ArithmeticException => println("0으로 나눌 수 없습니다.")
}
- 잘못된 코드:
try {
// 여러 다른 코드
} catch {
case e: Exception => println("에러 발생")
}
- 올바른 코드:
try {
// 특정 코드
} catch {
case e: ArithmeticException => println("산술 에러")
case e: FileNotFoundException => println("파일이 없음")
}