티스토리 뷰
Dart 언어의 8가지 특징
- main함수로 시작
- 어디에서나 변수를 선언하고 사용 가능
- 모든 변수가 객체이며 모든 객체는 object 클래스를 상속받음.
- 자료형이 엄격한 언어
- 제네릭 타입을 사용하여 개발할 수 있다.
- public 이나 protected같은 키워드가 없으며 외부로 노출하고 싶지 않다면 변수나 함수 이름 앞에 언더스코어를 이용해 표시할 수 있다.
- 변수나 함수의 시작은 언더스코어 또는 문자열로 시작하며 그 이후에 숫자가 올 수 있다.
- 삼항 연산자를 사용할 수 있다.
다트의 문자열 표현은 큰 따옴표나 작은 따옴표를 사용하는데 따옴표 안에 ${표현식} 과 같은 형태로 사용하면 표현식에 직접 변수를 넣을 수 있다.
다트의 자료형
구분 | 자료형 | 설명 |
숫자 | int | 정수형 |
double | 실수형 | |
num | 정수형 또는 실수형 숫자 | |
문자열 | String | 텍스트 기반 문자 |
불리언 | bool | True나 False |
자료형 추론 | var | 입력받은 값에 따라 자료형이 결정되며 한 번 결정된 자료형은 변경 불가 / 컴파일시 자료형 결정 |
dynamic | 입력받은 값에 따라 자료형이 결정되며 다른 변수를 입력하면 자료형 변경 가능 / 런타임시 자료형 결정 |
상수
1. final
2. const
final VS const
const : compile time에 결정되는 상수로 성능상의 이점을 가져올 수 있음
final : run time 에 결정되는 상수
Null safety
void main() {
int? age = null;
}
다트는 널세이프티 언어로 int형에 null을 초기화 시키려면 ?마크를 자료형 뒤에 붙여주어야 한다.
? 마크가 있는 변수들은 nullable로 기본적으로 null이 허용된다.
String? name;
String name = 'ra';
다트에서 String?와 String은 별개의 타입
String? name;
String name = 'ra'!; ( 그다지 좋은 방법은 아님)
nullable을 non nullable로 변경하는 방법에는 !마크를 붙이는 방법이 있다.
연산자
1.
String? str;
str ?? = 'Hello';
str이 null일 경우 Hello 값을 넣는다는 것을 의미 이는 아래의
str = str ?? 'Hello'와 동일
2. 삼항 연산자
bool isClear = true;
var weather = isClear == true ? '맑음' : '흐림';
isClear가 true일 경우에 '맑음'이 weather에 넣어진다.
casecade
void main() {
//1.
var paint = Paint();
paint.color = 'black';
paint.strokeCap = ;
//2.
var paint = Paint();
..color='black'
..strokeCap= ;
}
1번과 2번이 동일한 문장
TypeCasting
as 연산자 사용
네임드 파라미터
int sum({int a=0, int b = 0}){ // 기본 값 지정 해줘야 함
return a + b;
}
sum(a: 10, b: 20); //30
sum() //0
sum(a:5) //5
람다 표기법 제공
int sum (int a, int b ) => a +b ;
다트에서는 함수그 일급 클래스이다.
일급 클래스는 다른 매개변수로써 함수가 전달될 수 있다.
void main() {
print(calc(()=>10)); // 람다 형으로 10을 return하는 것을 의미
}
int calc(Function callback) { //일반적으로 Function은 입력값이 없는 것을 의미
return callback();
}
// 입력 값 지정
void main() {
print(calc(10,5,(a,b)=>a+b));
}
int calc(int a, int b, Function(int, int) callback) {
return callback(a,b);
}
//required 키워드를 주면 default 값을 주지 않아도 됨
void main() {
print(calc(10,5,callback: (a,b){
return a+b;
}));
}
int calc(int a, int b, {required Function(int, int) callback}) {
return callback(a,b);
}
리스트
다트에서 리스트는 인덱스 방식으로 접근 한다.
void main() {
List<int> items = [1,2,3];
items.forEach((e){
print(e);
});
items.forEach((e) => print(e)); // 람다식 사용 가능
for(int item in items) { // index 필요 없을 경우
print(item)
}
}
스프레드 연산자 : 리스트 안에 리스트를 넣을 수 있음, 리스트 간 결합을 할 때 사용
List<int> addItems = [...items, 4,5];
List 안에 if 문 가능 하다.
bool isRainy = false;
List<int> items = [1,2,3, if(isRainy)4]; // 한 줄만 되는 if 문 만 사용 가능 하다.
Map
void main() {
Map<String, dynamic> item = { //보통 다이나믹 형태로 씀 또는 Object? 형태
'name': 'john',
'age' : 40,
}; // 갱신 가능
for(var entry in item.entries){
print('${entry.key}, ${entry.value}');
}
print(item.keys); // map의 키 값
print(item.entries); // 전체 엔트리들 보여줌
print(item.values); //값만 보여줌
print(item['name']);
}
Class
- new 키워드는 생략이 가능하다.
void main() {
var point1 = Point(10,20,30,40); /nullable 변수는 초기화 안해도 됨
point1.move();
}
static String str = 'str' ; // 최상위변수 또는 최상위 함수를 클래스 밖에서 정의하여 어디서든 사용 가능
class Point{
static String global ='move'; //static 키워드
//늦은 초기화의 경우final처리해서 상수처리해도 무방
int x;
int y;
int? z; // nullable일 경우
late int g; // 늦은 초기화
int _a; //private일 경우
int _b;
Point(this.x,this.y,this._a, this._b,[this.z]){ //nullable일 경우 대괄호 처리
g = _a+_b;
}
void move(){
print('move');
}
}
named constructor
상속
mixin
-다중 상속 기법
-속성들을 가질 수 있음( 변수나 메소드 같은 것 )
-instance화 활 수 없음
- 추상클래스와 비슷
Generic
List에서 타입 정의할 때 제네릭 사용
import 문
as를 사용해서 별칭 사용 가능
import 'dart:async' as async;
비동기 처리
- Future를 사용
- Future는 오래걸리는 것을 처리해주는 것
스트림
'플러터 앱 스터디 일지' 카테고리의 다른 글
플러터 스터디 chap 4 (0) | 2021.09.26 |
---|---|
플러터 스터디 chap 3 (0) | 2021.09.26 |
플러터 앱 스터디 Chap2 -JSON 데이터 , 스트림 통신 (0) | 2021.09.15 |
플러터 앱 스터디 Chap2 -비동기 처리 방식 (0) | 2021.09.15 |
플러터 앱 스터디 chap 1 (0) | 2021.09.15 |