학습
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
코드 한 줄씩 동작 설명
divide함수가 두 개의 정수를 인자로 받습니다.try블록에서x / y를 실행합니다. 만약y가 0이라면ArithmeticException이 발생합니다.- 예외가 발생하면
catch블록이 실행되어 오류 메시지를 출력합니다. 0을 반환하여 함수 호출이 종료됩니다.main함수에서 두 번의divide호출이 이루어집니다.- 예외를 무시하는 것: 예외를 처리하지 않으면 프로그램이 갑자기 중단될 수 있습니다. 예외는 반드시 처리해야 합니다.
- 모든 예외를 포괄적으로 처리하는 것: 너무 일반적인 예외 처리로 인해 문제가 숨겨질 수 있습니다.
- 예외 처리는 프로그램의 안정성을 높이는 데 필수적입니다.
try-catch블록을 사용하여 예외를 효과적으로 처리할 수 있습니다.finally블록을 사용하여 자원 정리를 할 수 있습니다.- 실무에서 파일 읽기, 사용자 입력 처리 등에서 예외 처리는 매우 중요합니다.
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. 흔한 실수와 주의사항
- 잘못된 코드:
def dangerousMethod() = {
val result = 1 / 0 // 예외가 발생하지만 처리하지 않음
}
- 올바른 코드:
def safeMethod() = {
try {
1 / 0
} catch {
case e: ArithmeticException => println("예외 발생")
}
}
- 잘못된 코드:
try {
// 위험한 코드
} catch {
case _: Exception => println("오류 발생") // 모든 예외를 잡음
}
- 올바른 코드:
try {
// 위험한 코드
} catch {
case e: SpecificException => println("특정 오류 처리")
case e: AnotherException => println("다른 오류 처리")
}
6. 정리
다음에 학습하면 좋은 주제는 사용자 정의 예외 처리와 Future와 비동기 프로그래밍입니다.