예외처리 (Exception Handling)
- 예외란?
프로그램 실행 중 예상치 못한 문제 상황을 의미한다. 예를 들어 문자열 "가"를 숫자로 변환하려 하면 null 값이 생기고, 이를 강제로 사용하면 런타임 에러가 발생하여 프로그램이 종료될 수 있다. 또한 존재하지 않는 파일을 열거나, 인터넷 연결이 끊어진 상태에서 네트워크 요청을 보내는 경우도 예외에 해당한다. - try-catch 문법
- try 블록에는 오류가 발생할 수 있는 코드를 작성한다.
- catch(e) 블록은 예외가 발생했을 때 실행되며, e 객체에 구체적인 에러 정보가 담긴다.
- 이 구조를 통해 프로그램이 강제 종료되지 않고 정상적으로 흐름을 이어갈 수 있다.
try { int? value = int.tryParse("가"); print(value!); // 런타임 에러 발생 } catch (e) { print("예외 발생: $e"); }
- finally 블록
예외가 발생하든 하지 않든 항상 실행되는 블록이다. 파일을 닫거나, 네트워크 연결을 해제하거나, 프로그램 마무리 로그를 출력할 때 활용할 수 있다.
예외 처리를 하면서도 리소스 정리를 안전하게 할 수 있다는 점이 장점이다.
열거형 상수 (enum)
- enum이란?
이름이 있는 상수들의 집합으로, 특정 값들만 선택 가능하도록 제한하는 자료형이다.
요일, 상태 값, 신호등 색깔 등 "정해진 범위 안의 선택지"가 필요한 상황에서 사용하면 좋다. - 문자열 비교의 문제점
일반적으로 요일을 문자열로 받아서 조건문으로 처리하면 "수요알" 같은 오타 때문에 원하는 코드가 실행되지 않는다. 즉, 문자열 기반 조건은 실수에 취약하다. - enum 활용
enum을 사용하면 미리 정의된 값만 입력할 수 있으므로 코드의 안정성과 가독성이 좋아진다.
enum Weekday { monday, tuesday, wednesday, thursday, friday, saturday, sunday }
void printTodo(Weekday day) {
if (day == Weekday.monday) {
print('🧹 청소하기');
} else if (day == Weekday.tuesday) {
print('🛍️ 장보기');
} else if (day == Weekday.wednesday) {
print('🧼 빨래하기');
} else if (day == Weekday.thursday) {
print('🧾 장부 정리');
} else if (day == Weekday.friday) {
print('🧠 공부 마무리');
} else if (day == Weekday.saturday) {
print('🍕 친구 만나기');
} else if (day == Weekday.sunday) {
print('😴 푹 쉬기!');
}
}
void main() {
printTodo(Weekday.monday); // 출력: 청소하기
printTodo(Weekday.wednesday); // 출력: 빨래하기
// printTodo(Weekday.www); // enum 에 포함안된 값 입력 시 에러!
}
예외처리를 통해 프로그램이 강제 종료되지 않고, 문제 상황을 안전하게 제어할 수 있다는 점을 배웠다. 특히 finally 블록을 이용하면 예외 발생 여부와 상관없이 리소스를 정리할 수 있어 안정적인 코드를 작성할 수 있다.
enum은 정해진 값들만 다루는 상황에서 매우 유용하며, 단순 문자열 조건문보다 훨씬 안정적이고 오류 가능성이 낮다. 앞으로 프로젝트에서 요일, 상태, 모드 전환 등 한정된 선택지를 다룰 때 적극 활용해야겠다.