티스토리 뷰

Dart 언어의 8가지 특징 

  1. main함수로 시작
  2. 어디에서나 변수를 선언하고 사용 가능
  3. 모든 변수가 객체이며 모든 객체는 object 클래스를 상속받음.
  4. 자료형이 엄격한 언어
  5. 제네릭 타입을 사용하여 개발할 수 있다. 
  6. public 이나 protected같은 키워드가 없으며 외부로 노출하고 싶지 않다면 변수나 함수 이름 앞에 언더스코어를 이용해 표시할 수 있다. 
  7. 변수나 함수의 시작은 언더스코어 또는 문자열로 시작하며 그 이후에 숫자가 올 수 있다. 
  8. 삼항 연산자를 사용할 수 있다. 

 

다트의 문자열 표현은 큰 따옴표나 작은 따옴표를 사용하는데 따옴표 안에 ${표현식} 과 같은 형태로 사용하면 표현식에 직접 변수를 넣을 수 있다. 

 

다트의 자료형

구분 자료형 설명
숫자 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는 오래걸리는 것을 처리해주는 것 

스트림

댓글
공지사항