book : 코드팩토리의 플러터 프로그래밍

1. 다트 입문하기

다트의 가장 특징은, 개발 시에 JIT(Just In Time) 컴파일, 배포 시에 AOT(Ahead of Time) 컴파일을 사용한다는 점이다.

JIT는 런타임(실행 직전)에 컴파일을 수행하기에 핫-리로드(hot reload)와 디버깅에 유리하여 개발 단계에서의 효율을 올려준다.

AOT는 실행 이전(''직전''과는 다른 시점이다.)에 컴파일을 완료해두기 때문에 실행 속도가 빨라, 배포 단계에서 리소스활용이 유리할 수 있다.

기본 문법

변수선언

// var 선언
void main() {
  var name = 'puzzle';  // 타입 추론 기능 제공
  name = 'making'; // 변수 변경 가능
  name = 1;
  /*
  *error 발생 -> 한번 추론된 타입은 고정됨
  *Error: A value of type 'int' can't be assigned to a variable of type 'String'.
  */
}

// dynamic 변수 선언
void main() {
  dynamic name = 'puzzle';
  name = 1; // var 선언과 달리 타입 수정 가능
}

// final/const 변수 선언
void main() {
  final String name = '블랙핑크'; // 변수 선언 이후 수정 불가 (런타임 상수)
  name = 'BTS'; // Error: Can't assign to the final variable 'name'.

  const String name2 = 'BTS'; // 변수 선언 이후 수정 불가 (빌드 타임 상수)
  name2 = '블랙핑크'; //Error: Can't assign to the const variable 'name2'.

  // const는 빌드 시점에 변수가 고정, final은 런타임 시전에 변수가 고정됨
  // 그렇기 때문에 런타임 시 값이 제공되는 메소드를 사용할 경우 const는 에러가 발생한다.
  // 예를 들어 DateTime.now()는 런타임시 값을 제공하기 때문에 final로만 사용 가능함
}

컬렉션

//List
void main() {
  List<int> list = [1, 2, 3, 4];

  //원소 지정
  print(list[0]); // 1 출력

  //길이 반환
  print(list.length); // 4

  //add(), 값 추가
  list.add(5);
  print(list); //[1, 2, 3, 4, 5]

  //where(), List 순회 하면서 조건에 맞는 값 필터링
  final oddNumber = list.where((num) => num % 2 == 1);
  print(oddNumber.toList()); //.toList() 사용시 리스트로 변경, [1,3,5]

  //map() , List 순회 하면서 값 변경 가능
  final addTen = list.map((num) => num +=10);
  print(addTen.toList()); // [11,12,13,14,15]

  //reduce() , List 순회 하며 매개변수에 입력된 함수 실행, 값이 쌓여감
  final sum = list.reduce((value, element) => value + element);
  print(sum); //15

  //fold(), reduce()와 원리가 같지만 타입이 달라도 사용 가능
  final sumByString = list.fold<String>("시작", (value, element) => '${value.toString()} , ${element.toString()}');
  print(sumByString); // "시작 , 1 , 2 , 3 , 4 , 5"
}



//Map
void main() {
  Map<String, String> dictionary = {
    '월요일' : 'monday',
    '금요일' : 'friday'
  };

  dictionary.keys; // key 반환
  dictionary.values; // value 반환 
}


//Set
void main() {
  Set<String> lastName = {'김', '이', '박'}; // 중복값 불가
  lastName.toList(); // Set -> List
  Set.from(lastName); // List -> Set
}

//enum
enum Status {
  approved,
  pending,
  rejected
}

void main() {
  Status status = Status.approved;
}

null 관련 연산자

void main() {
  //type뒤에 ?를 명시하여 null값을 가질 수 있음
  double? number1 = 1;

  //?를 명시하지 않아 에러 발생
  double number2 = null;

  //자동으로 null 값 지정
  double? nubmer3;

  //number3가 null일 경우 값 지정
  number3 ??= 3;

  //number3가 null이 아니라서 3이 유지됨
  number3 ??= 4;
}

typedef와 함수

//typedef는 함수의 시그니처를 정리하는 것

typedef Operation = void Function(int x, int y);

int add(int x, int y) {
  return x+y;
}

int subtract(int x, int y) {
  return x-y;
}

void main() {
  Operation oper = add;
  oper(1,2); //1+2

  oper = subtract;
  subtract(1,2); //1-2
}

+ Recent posts