[플러터] 1. 다트 언어 마스터하기

Jun·2024년 2월 10일
0

1장에서는 다트 언어의 기본 문법에 대해 설명합니다.

메인 함수

다트는 프로그램 시작점인 엔트리 함수 기호로 main()을 사용합니다.

void main() {}

주석

주석 기호로 //, /**/, /// 를 사용합니다.

void main() {
  // 한 줄 주석
  
  /*
  * 여러 줄 주석
  * 여러 줄 주석
  */
  
  /// 문서 주석
}

출력

void main() {
  print('Hello World');
}

변수 선언

변수 선언 방법으로 다음과 같이 4가지가 있습니다.

  • var
  • dynamic
  • final/const
  • 타입

var

변수에 값이 들어가면 자동으로 타입을 추론하는 방법입니다.
타입이 추론된 이후에는 다른 타입을 변수에 저장할 수 없습니다.

void main() {
  var name = '코드팩토리'; // string으로 추론
  name = '골든래빗';
  name = 10; // error
}

dynamic

var와 다르게 변수의 타입이 고정되지 않으며 다른 타입의 값으로 변경할 수 있습니다.

void main() {
  var name = '코드팩토리';
  name = 10;
}

final/const

변수의 값을 처음 선언 후 변경할 수 없습니다.
final은 런타임 시간에 결정되는 상수이고, const는 빌드 시간에 결정되는 상수입니다.

void main() {
  final DateTime now = DateTime.now(); // 런타임 때 현재 시간
}
void main() {
  const DateTime now = DateTime.now(); // 빌드 시점에 알 수 없음
}

코드를 실행하지 않은 상태에서 값이 확정되면 const를, 실행될 때 확정되면 final을 사용하면 됩니다.

타입

직접적으로 타입을 명시해주는 방법

void main() {
  String name = '이름';
  int intValue = 10;
  double doubleValue = 2.5;
  bool isTrue = true;
}

컬렉션

여러 값을 하나의 변수에 저장할 수 있는 타입입니다.
List, Map, Set이 이에 속합니다.
다트의 컬렉션 타입은 서로의 타입으로 자유롭게 형변환이 가능하다는 장점이 있습니다.

List 타입

void main() {
  List<String> blackPinkList = ['리사', '지수', '제니', '로제'];
}

List타입에서 제공하는 함수가 많습니다. 그중 몇가지만 소개합니다.

  • add(): 배열에 원소를 추가합니다.
  • where(): 배열을 필터링합니다. (js와 filter와 유사)
  • map(): 배열의 전체의 값을 변경하고 iterable로 반환합니다.. (js의 map과 유사)
    • 반환된 iterable을 List로 변경하려면 iterable.toList()를 실행합니다.
  • reduce(): 배열을 하나의 값으로 반환합니다. 이때 배열의 원소 타입으로 반환합니다.
  • fold(): reduce와 유사하지만, 어떠한 타입이든 반환할 수 있습니다. (js의 reduce와 유사)

Map 타입

Map 타입은 키와 값의 짝을 저장합니다.

void main () {
  Map<String, String> dictionary = {
    'Harry Potter': '해리 포터',
    'Ron Weasley': '론 위즐리',
  }
  
  print(dictionary.keys); // (Harry Potter, Ron Weasley)
  print(dictionary.values.toList()); // [해리 포터, 론 위즐리]
}

Set 타입

Set은 중복 없는 값들의 집합입니다.

void main() {
  Set<String> blackpink = {'로제', '지수', '지수'};
  print(blackpink); // {로제, 지수}
  print(blackpink.toList); // [로제, 지수]
  print(blackpink.contains('로제')); // true
  
  List<String> blackpink2 = ['로제', '지수'];
  Set.from(blackpink2) // List -> Set 변환
}

enum 타입

한 변수로 몇 가지 옵션을 제한할 때 사용할 수 있습니다.

enum Status {
  approved,
  pending,
  rejected,
}

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

연산자

산술 연산자

void main() {
  double number = 2;
  
  print(number + 2);
  print(number - 2);
  print(number * 2);
  print(number / 2);
  print(number % 3);
  number++;
  number--;
  number += 2;
  number -= 2;
  number *= 2;
  number /= 2;
}

null 관련 연산자

다트에서는 변수 타입이 null값을 가지는지 여부를 직접 지정해줘야 합니다.

void main() {
  double? number1 = 1;
  double? number2 = null;
  double number3 = null; // error
}

?? 연산자를 사용하여 변수의 값이 null일 때만 값을 지정할 수 있습니다.

void main() {
  double? number = null;
  number ??= 1;
  number ??= 2; // null이 아니기 때문에 1이 유지됩니다.
}

비교 연산자

void main() {
  int num1 = 1;
  int num2 = 2;
  
  // 값 비교
  print(num1 > num2);
  print(num1 < num2);
  print(num1 >= num2);
  print(num1 <= num2);
  print(num1 == num2);
  print(num1 != num2);
  
  // 타입 비교
  print(num1 is int);
  print(num1 is String);
  print(num1 is! int);
  print(num1 is! String);
  
}

논리 연산자

void main() {
  bool result1 = true && false // false
  bool result2 = true || false // true
}

제어문

if문

void main() {
  if () {
    ...
  } else if () {
    ...
  } else {
    ...
  }
}

switch 문

void main() {
  int num = 1;
  switch(num) {
    case 1:
      break;
    case 2:
      break;
    default:
      ...
  }
}

for문

void main() {
  for (int i = 0; i < 3; i++) {
    print(i);
  }
}
void main() {
  List<int> numList = [1, 2, 3];
  for (int num in numList) {
    print(num);
  }
}

while문

void main() {
  int total = 0;
  while(total < 10) {
    total += 1;
  }
}
void main() {
  int total = 0;
  do {
    total += 1;
  }while(total < 10)
}

함수와 람다

함수

int add(int a, int b) {
  return a + b;
}

void main() {
  int result = add(1, 2);
}

다트는 네임드 파라미터를 통해 순서와 상관 없이 파라미터를 지정할 수 있습니다.
네임드 파라미터를 이용하려면 required와 중괄호 {}를 사용합니다.
여기서 required는 매개변수가 null 값이 불가능한 타입이면 기본값을 지정해주거나 필수로 입력해야 한다는 의미입니다.

int add({required int a, required int b}) {
  return a + b;
}

void main() {
  int result = add(a: 1, b: 2);
}

파라미터에 기본값을 지정해 줄 수 있습니다.

int add(int a, [int b = 2]) {
 return a + b;
}

int add2({required int a; int b = 2}) {
 return a + b;
}

void main() {
  int result = add(1); // 3
  int result2 = add2(a: 1); // 3
}

포지셔널 파라미터와 네임드 파라미터를 섞어서 사용할 수도 있습니다.

int add(int a, {required int b, int c = 4}) {
 return a + b + c;
}

void main() {
 int result = add(1, b: 2, c: 3);
}

람다 함수

void main() {
  List<int> numbers = [1, 2, 3];
  
  final allMembers = numbers.reduce((v, el) => v + el);
}

typedef와 함수

typedef는 함수의 시그니처를 정의하는 값으로, 함수를 타입으로 정의할 수 있습니다.

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

void add (int x, int y) {
  print(x + y);
}

void calculate(int x, int y, Operation oper) {
  oper(x, y);
}

void main() {
  Operation oper = add;
  calculate(1, 2, oper);
}

try...catch

void main() {
  try {
    final String name = 'hello';
    throw Exception('이름이 잘못됐습니다.');
  } catch(e) {
    print(e);
  }
}

《Must Have 코드팩토리의 플러터 프로그래밍 2판》의 스터디 내용 입니다.

profile
HiHi

0개의 댓글