작성자 | 이재영 |
일 시 | 2024. 5. 23 (목) 18:00 ~ 21:00 |
장 소 | 복지관 b128-1호 |
참가자 명단 | 임혜진, 이재영, 성창민, 김명원, 장원준 |
사 진 | ![]() |
목차
- 에러 핸들링
- Throw
- Try, On, Catch
- Finally
- 비동기 지원
- Future 다루기
- Stream 다루기
이번 주차에는 Dart 언어를 사용한 에러 핸들링과 비동기 지원에 대해서 알아볼 것이다.
에러 핸들링
다른 언어에서도 그렇지만 에러 핸들링은 정말 중요한 개념이다.
예외란 예상하지 못한 일이 발생했다는 것을 의미하는 에러를 말한다. 예외가 캐치되지 않았다면, 예외를 발생시키는 isolate가 지연된 상태이고 보통 해당 isolate나 프로그램이 종료된다. Java와 다르게, Dart의 모든 예외는 확인되지 않은 예외이다. 메서드는 자신이 어떤 예외를 발생시킬지 선언하지 않고, 개발자에게 예외를 캐치하도록 요구하지 않는다. 미리 정의된 다양한 서브타입과 함께 Exception 그리고 Error 타입을 제공한다. 원하는 예외를 정의하는 것도 가능하다.
1. Throw
예외를 throwing 또는 raising 할 수 있는 기능을 가지고 있다.
throw FormatException('Expected at least 1 section');
이런 식으로 내장되어 있는 Exception을 사용할 수도 있고,
throw 'Out of llamas!';
이런 식으로 임의의 객체도 throw 할 수 있다.
2. Try, On, Catch
try 절은 try{} 구문 안에서 특정 에러가 발생하였을 때 처리를 해주는 기능을 가진다. try 절은 try-on, try-catch, try-on-catch 등의 구문등을 조합하여 사용할 수 있다.
우선 try-on 이다. try-on은 예외클래스 타입을 지정해야 할 때 사용한다.
try{
// code that might throw an exception
}on 예외클래스{
// code for handling exception
}
try{} 안에서 on으로 지정한 예외가 에러로 발생하면 on {} 구문으로 이동하여 처리를 해주는 방식이다.
다음은 try-catch 이다. try-catch는 예외 핸들러가 예외 객체를 필요로 할 때 사용한다.
try{
// code that might throw an exception
}catch(e){
// code for handling exception
}
try{} 안에서 에러가 발생하면 어떠한 에러이든 catch로 이동한다. 에러에 대한 내용은 'e' 에 담기게 되고, 그것을 이용하여 핸들링을 할 수도 있다.
다음은 try-on-catch이다. try-on-catch는 on으로 예외클래스 타입을 지정하고, 지정이 되지 않은 예외 핸들러를 다룰 때 사용한다.
try {
// code that might throw an exception
} on OutOfLlamasException {
// 특정한 예외
} on Exception catch (e) {
// Exception 타입인 예외
} catch (e) {
// 타입을 정하지 않은 catch 절로 모든 예외를 처리
}
try{} 안에서 에러가 발생하면 일단 on으로 지정된 예외들을 먼저 확인한 이후, catch로 가는 방식으로 예외를 핸들링할 수 있다. 그런데 중간에 보면 on과 catch가 동시에 사용된 경우를 볼 수 있다. 예외클래스 타입을 지정하고 예외 객체를 필요로할 때 사용되는 구문이다.
3. Finally
예외 발생 여부와 상관 없이 어떤 코드를 실행하고 싶다면, finally 절을 사용한다.
try {
// code that might throw an exception
} finally {
// 예외가 발생되더라도, 항상 실행된다.
}
try {
// code that might throw an exception
} catch (e) {
print('Error: $e'); // 예외를 먼저 처리합니다.
} finally {
// 다음 실행
}
비동기 지원
Dart의 라이브러리에는 Future 또는 Stream 객체를 반환하는 함수가 많다. 이런 함수들을 비동기 함수라고 한다. 이 함수들은 시간이 오래 걸릴 수도 있는 작업이 완료되기를 기다리지 않고, 값을 반환할 수 있게 해준다.
1. Future 다루기
Future은 Dart에서 지금은 없지만 미래에 요청한 데이터 혹은 에러가 담길 것이라고 말해주는 기능을 한다. 예를들어 Future<int> 라고 한다면 저곳에는 값이 아직은 안담겨있지만 나중에는 int 또는 에러가 담길 것이라고 말해주는 것이다.
await lookUpVersion();
await는 Future를 조금 더 용이하게 다루기 위한 키워드로, await를 사용하는 코드는 비동기 함수의 결과를 기다리는 코드이다.
Future<void> checkVersion() async {
var version = await lookUpVersion();
// version 변수를 사용...
}
그리고 이처럼 await를 사용하려면 해당 코드를 async로 표시된 async 함수 안에 있어야 한다. 그리고 async로 지정한 함수는 무조건 Future를 반환해야 한다.
Future은 값 또는 에러가 담기기 때문에 위에서 언급했던 try 구문을 사용하여 깔끔하게 처리할 수 있다.
2. Stream 다루기
Stream은 async 와 비동기 for 루프를 사용하여 값을 가져올 수 있다.
await for (varOrType identifier in expression) {
// Stream이 값을 내놓을 때마다 실행됩니다.
}
비동기 for 루프는 위와 같은 형태를 가진다.
위 표현식의 값은 반드시 Stream 타입이어야 한다. 실행 순서는 다음과 같다.
- Stream이 값을 내놓을 때까지 기다린다.
- 도출된 값을 변수로 설정하여 for 루프의 바디를 실행한다.
- Stream이 끝날 때까지 1과 2를 반복한다.
이번 주차에도 Dart언어에 대해서 알아보았다. 에러 핸들링과 비동기 기능을 통해 확실히 앱 개발에 큰 도움을 얻을 수 있을 것 같다고 느꼈다.