✏️dart 란 무엇인가?
- 구글에서 만든 프로그래밍 언어로 dart 를 사용하여 flutter를 개발할 수 있다.
- 객체 지향언어이며 다른 언어들과 매우 유사한 방법으로 구현 및 사용이 가능하다.
- Just in Time 과 Ahead of Time 방식으로 컴파일 할 수 있다.
=> Just in Time(JIT) : 개발을 할 때 사용하는 컴파일 방식
=> Ahead of Time(AOT) : 배포를 할 때 사용하는 컴파일 방식
- null-safety 를 지원한다.
- 멀티 플랫폼에 사용이 가능하다.(안드로이드, IOS, web, IoT)
🖥️dart 특징 1: null-safety
> null-safe 언어
객체를 선언하면 기본적으로 null 을 넣을 수 없으며, 문법적으로 지정을 해줘야 null 값을 가질 수 있음. null 로 설정된 변수에 예기치 않게 액세스하는 오류를 방지함.
- dart 언어는 견고한 null 안전성을 가지고 있다.
- 실제로 YDrive 앱 개발시 null 안전성을 사용하여 런타임 에러를 방지한 경험이 있다.
> null 안전성 원칙
- null 이 될 수 없는 것이 기본 : 코드에 명시적으로 null 이 될 수 있다고 표시하는 것이 아니라면, 기본적으로 null 이 될 수없는 값으로 인식
- 점진적인 적용이 가능 : 어떤 코드를 언제 null-safe한 코드로 마이그래이트 할지 임의로 결정(마이그레이션 툴 제공)
- 완전히 견고함 : dart 의 null 안전성은 신뢰할 수 있으며, 컴파일러 최적화가 잘되어있음
> 연산자
- '?' 연산자 : 어떤 변수에 null 이 들어갈 수도 있음을 의미
int? number; // null 가능
int number; // null 불가능
- '!' 연산자 : 변수가 null 이 아닌 것으로 취급하도록 dart 에 지시하는 것. 변수가 null 이 아니라고 확신하지만 dart의 분석에서 이를 감지할 수 없을 때 유용(남발시 런타임에 null 이 된다면, 오류 발생!)
🖥️dart 특징 2: async
동기와 비동기 이해하기
작업 a와 b가 있을 때,
동기는 a작업을 수행한 후 a작업이 끝나면 b작업을 수행함
=> 동기 작업: 해당 작업이 완료되기 전에 다른 작업의 실행을 블락
비동기는 a작업을 수행함과 동시에 b작업도 같이 수행함
=> 비동기 작업: 비동기 작업은 해당 작업이 완료되기 전에도 다른 작업을 실행할 수 있음
비동기 작업의 결과는 보통 Future 로 제공하고, 결과가 다수의 파트를 차지한다면 Stream 으로 제공함
async와 await
async와 await 는 dart 의 비동기 처리를 위한 것으로, Future 를 조금 더 용이하게 다루기 위한 키워드임. async와 await 를 사용하면 사용하기 전보다 조금 더 간결하고 직관적이게 코드를 구현할 수 있음.
=> await 키워드를 사용한 함수는 무조건 async 함수여야 함
=> await 를 만나면 해당 동작이 완료되기 전까지 멈추어서 기다려야함
=> async 함수는 무조건 Future 를 반환해야함
코드를 통한 이해
Future<ProcessedData> createDate() async {
final id = await _loadFromDisk();
final data = await _fetchNetworkData(id);
return ProcessedData(data);
}
- createDate() 함수가 실행되고, 가장 먼저 첫 번째 줄의 await 키워드가 붙은 _loadFromDisk() 를 수행함
=> await 키워드가 붙었기 때문에 _loadFromDist()의 작업이 끝날 때까지 실행을 중지함
- 함수를 호출한 곳에 Future 를 return 하고, 이 함수는 비동기 처리하다는 답을 주고 이 함수가 모두 완료되면 ProcessedData 가 나올 것이라는 것을 알려줌
- _loadFromDisk() 함수의 수행이 완료되면 그 다음 줄을 수행함
=> 이번에도 await 키워드가 붙었기 때문에 _fetchNetworkData(id)의 수행이 끝날 때 까지 실행을 중지함
- _fetchNetworkData(id) 의 작업이 끝나면 return ProcessedData(data) 가 수행되고 이 return 을 통해 Processed가 반환되게됨
🖥️dart 특징 3: List
- dart 에서 배열은 List 객체로 존재함.
var list = [1, 2, 3]; // dart 는 이 List를 List<int> 타입으로 추정
- List 는 0부터 시작하는 제로 베이스 인덱싱을 사용하며, list.length-1이 list의 마지막 인덱스임 (위의 코드에서 print(list[0]) 은 1을 출력, print(list[3]) 은 에러를 띄움)
- 컴파일 타임 상수인 리스트를 생성하고 싶다면, list 리터럴 앞에 const를 추가함
var constantList = const [1, 2, 3];
🖥️dart 특징 4: enum
-
enum 은 열거 타입이라고 하며, 이 타입은 정해진 수의 상수 값을 가지는 특별한 종류의 클래스임
-
dart 는 필드, 메서드, 상수 생성자 같이 수가 정해져 있는 상수 인스턴스가 있는 클래스를 선언하는데 enum 을 사용하는 것이 가능
-
this 를 사용하여 현재 enum 값 참조 가능
-
enum 선언하기
enum Color {red, green, blue} // enum은 0을 기준으로 인덱스된 위치값을 반환
final favoriteColor = Color.blue;
if(favoriteColor == Color.blue) {
print('My favorite Color is Blue!');
}
참고 사이트
https://jake-seo-dev.tistory.com/672
https://dart-ko.dev/null-safety
https://dart-ko.dev/language/collections#lists
https://dart-ko.dev/language/enum
https://velog.io/@jintak0401/FlutterDart-%EC%97%90%EC%84%9C%EC%9D%98-Future-asyncawait