일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 직장인인강
- 직장인자기계발
- 패스트캠퍼스
- 30개프로젝트로배우는iOS앱개발withSwift초격차패키지Online.
- 직장인공부
- 코딩테스트
- 자바
- 오공완
- 자바스크립트
- 패캠reactnative
- fastcampus
- 파이썬
- 수강료0원챌린지
- 코딩자격증
- 패스트캠퍼스후기
- 패캠챌린지
- 직정인자기계발
- 패캠
- 패캠인강후기
- 패캠강의후기
- 코딩교육
- 환급챌린지
- reactnative강의
- Today
- Total
라티의 작은 일기장
패스트캠퍼스 환급챌린지 4일차 미션(2월 4일): 15개 프로젝트로 실무까지 끝내는 Dart & Flutter 앱 개발 강의 후기 본문
패스트캠퍼스 환급챌린지 4일차 미션(2월 4일): 15개 프로젝트로 실무까지 끝내는 Dart & Flutter 앱 개발 강의 후기
코드라티 2024. 2. 4. 23:45오늘은 간단하게 Dart 프로젝트를 셋업해보고 나머지 문법들에 대해서 알아보려 한다.
Dart에서 함수와 메서드는 어떻게 구현될까? 지금까지 살펴본 문법들이 타 언어들과 유사한 점이 있기에, Dart에서 함수와 메서드를 선언하는 방법도 크지 않을것 같다. 일단 이제부터는 DartPad가 아니라 Android Studio IDE의 Dart 프로젝트 상에서 실습을 진행해보려 한다. 아래와 같이 설치한 Flutter SDK 내부의 Dart SDK 로컬 경로를 잡아주자.
그 다음에 프로젝트 디렉토리의 위치를 잡아주면 아래 모습과 같이 Dart 프로젝트의 초기 설정이 완료된다.
테스트겸 간단하게 Hello World도 찍어보았다. DartPad보다 컴파일도 빠르고 IDE에서 제공하는 자동완성도 매우 만족.
void main() {
int num1 = 10;
int num2 = 50;
int sum = add(num1, num2);
print(sum);
}
int add(int num1, int num2) {
return num1 + num2;
}
Dart에서 함수는 위와 같이 사용한다.
void main() {
bool flag = true;
int target = 3;
if (flag) {
print("진실");
} else {
print("거짓");
}
if (target < 0) {
print("음수입니다");
} else if (target == 0) {
print("0입니다.");
} else {
print("양수입니다");
}
}
조건문도 뭐 ... 똑같다. 그런데 switch-case문이 좀 특이한게, 문법 자체는 특이한게 아니지만 Flutter 3.10 / Dart 3.0 이상을 기점으로 변경된 점이 좀 있다.
void main() {
int target = -1;
switch (target) {
case 1:
print("1이지롱");
/// return or break 생략 가능 if Flutter 3.10 / Dart 3.0 이상
case 2:
print("2지롱");
case 3:
print("3이지롱");
case < 0: /// case에 범위 지정도 가능 if Flutter 3.10 / Dart 3.0 이상
print('음수지롱');
default:
print("몰랑");
}
}
별건 아니고 위에 주석 달아놓은 것 처럼 case마다 일일이 break나 return을 달아줘야했던게 생략이 가능해지고, target 값에 대해 범위 지정도 가능하게 변경됐다는 것이다. 진짜 뭐 별거 아니긴 한데 원래 쓰시던 분들은 편해졌음을 실감하셨겠지...
반복문도 살펴보자. 반복문은 for, for-in, while, do-while처럼 익숙한 녀석들이 있다.
테스트겸 for문 계열만 일단 알아보자.(while문은 다른 언어랑 똑같다..)
void main() {
List<int> list = [0, 1, 2, 3, 4];
for (int i = 0; i < 5; i++) {
print('for문으로 찍어본 $i');
}
for (final index in list) {
print('for문으로 찍어본 $index');
}
}
예외 처리를 할 때는 익숙한 try-catch, finally, throw가 있고, 뭔가 처음 들어보는 on, rethrow도 있다.
void main() {
try {
/// 예외 발생 코드
int num = 10;
print(num ~/ 0);
} on UnsupportedError catch (error, stack) {
print("~/ 해당 연산자는 0으로 나눌 수 없습니다.");
} catch(e, s) {
print("알 수 없는 에러가 발생했습니다.");
} finally {
print("try-catch문이 실행됐지롱");
}
}
on은 특정 에러에 대한 핸들링을 할 때 사용하는 연산자고, rethrow는 아래 코드를 보자.
void main() {
try {
throw Exception("에러지롱");
} catch (e, s) {
print(e);
print(s);
rethrow;
}
}
rethrow는 catch문에서 잡아놨던 에러를 다시 던지는 신기한 기능이다.
위 실행 결과를 보면 catch 문에서 잡았던 '에러지롱' 에러를 다시 던져서 프로그램이 죽는 것을 로그로 확인할 수 있다.
마지막으로 비동기를 다루는 문법을 살펴보자. 개인적으로 기대가 됐던 부분...!
async / await / Future와 async* / yield / Stream이 있다.
전자와 후자는 한 세트의 문법이고, Future와 Stream은 차이가 명확하니 짚고 넘어가보자.
Future는 응답을 1회만 받는 경우에 사용하고, Stream은 지속적인 응답을 받는 경우에 사용한다.
각각 단발성 API 요청과 WebRTC, WebSocket과 같은 양방향 프로토콜을 처리할 때 사용하면 될 것 같다.
void main() {
Future<void> todo (int second) async {
await Future.delayed(Duration(seconds: second)); // second만큼 지연시키는 코드
print('TODO Done in $second second');
}
todo(1);
todo(2);
todo(3);
}
간단하게 async / await / Future을 실습해보는 예제이다. todo 함수는 총 3회, 각각 1, 2, 3초 후에 메시지를 출력하도록 호출되었지만 비동기 함수이기 때문에 병렬적으로 실행되는 것을 확인할 수 있다.
마지막으로 async* / yield / Stream의 예제 코드도 살펴보자.
void main() {
Stream<int> todo() async* {
print('TODO');
int counter = 0;
while(counter <= 10) {
counter++;
await Future.delayed(Duration(seconds: 1));
print('TODO is Running $counter');
yield counter;
}
}
todo().listen((event) {});
}
Stream은 기본적으로 지속적인 응답을 받을 때 사용하도록 만들어졌기 때문에, while문을 사용해서 응답을 지속적으로 반환하는 코드를 간단하게 구현해보았다. yield의 역할이 여기서 나오는데, 일종의 반환문처럼 쓰이고 있다.
근데 사실 이것만 보고는 잘 와닿지 않아서 실제 프로젝트를 구현해보면서 확실히 이해해보는게 필요할 것 같다 ㅠ 힘내보자!
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.