[flutter]-dart 언어 공부

callikys.note·2024년 3월 19일

flutter

목록 보기
1/1

✏️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 안전성 원칙

  1. null 이 될 수 없는 것이 기본 : 코드에 명시적으로 null 이 될 수 있다고 표시하는 것이 아니라면, 기본적으로 null 이 될 수없는 값으로 인식
  2. 점진적인 적용이 가능 : 어떤 코드를 언제 null-safe한 코드로 마이그래이트 할지 임의로 결정(마이그레이션 툴 제공)
  3. 완전히 견고함 : dart 의 null 안전성은 신뢰할 수 있으며, 컴파일러 최적화가 잘되어있음

> 연산자

  1. '?' 연산자 : 어떤 변수에 null 이 들어갈 수도 있음을 의미
int? number; // null 가능
int number; // null 불가능
  1. '!' 연산자 : 변수가 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);
}
  1. createDate() 함수가 실행되고, 가장 먼저 첫 번째 줄의 await 키워드가 붙은 _loadFromDisk() 를 수행함
    => await 키워드가 붙었기 때문에 _loadFromDist()의 작업이 끝날 때까지 실행을 중지함
  2. 함수를 호출한 곳에 Future 를 return 하고, 이 함수는 비동기 처리하다는 답을 주고 이 함수가 모두 완료되면 ProcessedData 가 나올 것이라는 것을 알려줌
  3. _loadFromDisk() 함수의 수행이 완료되면 그 다음 줄을 수행함
    => 이번에도 await 키워드가 붙었기 때문에 _fetchNetworkData(id)의 수행이 끝날 때 까지 실행을 중지함
  4. _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을 기준으로 인덱스된 위치값을 반환
  • enum 사용하기
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

0개의 댓글