플러터를 위한 다트 언어를 알아보자

1. 다트 타입(Type)

  • num: 정수(int)와 실수(double)의 슈퍼타입입니다.
  • int: 정수를 나타냅니다.
  • double: 실수를 나타냅니다.
  • String: 문자열을 나타냅니다.
  • bool: true 또는 false 값을 가지는 불리언(Boolean) 타입입니다.
  • var: 타입을 명시적으로 지정하지 않고, 나중에 할당된 값에 따라 타입이 결정되는 동적 타입입니다.
  • dynamic: 타입이 미지정되거나 런타임 중에 타입을 변경할 수 있는 동적 타입입니다.
  • List: 다트에서 배열을 나타내는데 사용되며, 리스트(List) 데이터 타입입니다.
  • Set: 순서가 없고 중복된 값이 없는 데이터 집합(Set)을 나타내는 데이터 타입입니다.
  • Map: 키와 값의 쌍(key-value pair)을 가지는 데이터 타입으로, 연관 배열 또는 딕셔너리(Dictionary)라고도 합니다.

2. 상수(Constant)


상수와 변수의 주요 차이점은 값의 변경 가능 여부입니다. 변수는 값을 변경할 수 있지만, 상수는 값을 변경할 수 없습니다. Dart에서 상수를 선언하는 방법은 finalconst 키워드를 사용하는 것입니다.

3. 다트 함수 (Dart Function)

Dart는 객체 지향 언어이며, 함수 또한 객체로 취급됩니다. 함수는 객체이므로 다음과 같은 특성을 갖습니다:

3.1 변수가 함수 참조 가능

Dart에서 함수를 변수에 할당하여 참조할 수 있습니다.

   String name = getName();

   String getName(){
     return 'abc';
   }

3.2 다른 함수의 인자로 함수 전달 가능

Dart에서 함수는 다른 함수의 인자로 전달할 수 있습니다.

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

   int sub(int a, int b){
     return a - b;
   }

   int operation(int Function(int, int) func, int x, int y){
     return func(x, y);
   }

   void main(){
     int a = 10;
     int b = 5;
     print(operation(add, a, b)); // 함수를 다른 함수의 인자로 전달
     print(operation(sub, a, b)); // 함수를 다른 함수의 인자로 전달
   }

3.3 이름 있는 선택 매개변수 (Named Optional Parameter)

함수 호출 시 매개변수에 인자 값을 매개변수명을 지정하여 넘길 수 있습니다.

   String getAddress(String city, {String district, String zipCode = '111222'}){
     return '$city시 $district구 $zipCode';
   }

   void main(){
     print('${getAddress('서울', district: '강남')}');
   }

3.4 위치적 선택 매개변수 (Positional Optional Parameter)

함수의 매개변수에 초깃값을 설정하여 함수 호출 시 인자를 생략할 수 있습니다.

   String getAddress(String city, [String district = '강남구', String zipCode = '111222']){
     return '$city시 $district구 $zipCode';
   }

   void main(){
     print('${getAddress('서울', '마포구')}');
   }

3.5 익명 함수 (Anonymous Function) 및 람다 표현식 (Lambda Expression)

Dart에서 익명 함수를 생성할 수 있으며, 이러한 함수를 람다 표현식 또는 클로저라고도 합니다.

   // 익명 함수
   var multiply = (int a, int b){
     return a * b;
   }

   // 람다 표현식
   int subtract(int a, int b) => a - b;

4. 다트 연산자 (Dart Operators)

4.1 산수 연산자

  • +: 덧셈
  • -: 뺄셈
  • *: 곱셈
  • /: 나눗셈
  • ~/: 정수 나눗셈
  • %: 나머지
  • ++: 증가 연산자 (1씩 증가)
  • --: 감소 연산자 (1씩 감소) 예:
   int a = 5;
   int b = 3;
   int sum = a + b; // 8
   int difference = a - b; // 2
   int product = a * b; // 15
   double quotient = a / b; // 1.6666666666666667
   int integerDivision = a ~/ b; // 1
   int remainder = a % b; // 2

4.2 할당 연산자

  • =: 변수에 값을 할당
  • +=: 더하고 할당
  • -=: 빼고 할당
  • *=: 곱하고 할당
  • /=: 나누고 할당
  • ~/=: 정수 나누고 할당 예:
   int x = 5;
   x += 3; // x는 이제 8
   x -= 2; // x는 이제 6
   x *= 4; // x는 이제 24
   x /= 3; // x는 이제 8.0
   x ~/= 2; // x는 이제 4

4.3 관계 연산자 (비교 연산자)

  • ==: 같음
  • !=: 다름
  • >: 크다
  • <: 작다
  • >=: 크거나 같다
  • <=: 작거나 같다 예:
   int a = 5;
   int b = 3;
   bool isEqual = (a == b); // false
   bool isNotEqual = (a != b); // true
   bool isGreater = (a > b); // true
   bool isLess = (a < b); // false
   bool isGreaterOrEqual = (a >= b); // true
   bool isLessOrEqual = (a <= b); // false

4.4 비트 & 시프트 연산자

  • 비트 연산자: & (AND), | (OR), ^ (XOR), ~ (NOT)
  • 시프트 연산자: << (왼쪽 시프트), >> (오른쪽 시프트) 예:
   int a = 5; // 이진수: 0101
   int b = 3; // 이진수: 0011

   int bitwiseAnd = a & b; // 1 (이진수: 0001)
   int bitwiseOr = a | b; // 7 (이진수: 0111)
   int bitwiseXor = a ^ b; // 6 (이진수: 0110)
   int bitwiseNot = ~a; // -6 (이진수: 11111010)

   int leftShift = a << 2; // 20 (이진수: 10100)
   int rightShift = a >> 1; // 2 (이진수: 0010)

4.5 타입 검사 연산자

  • as: 형 변환
  • is: 객체가 특정 타입이면 true를 반환
  • is!: 객체가 특정 타입이면 false를 반환 예:
   String text = 'Hello';
   int number = 42;

   // 형 변환
   double doubleNumber = number as double;

   // 타입 검사
   bool isString = text is String; // true
   bool isInt = text is int; // false
   bool isNotString = text is! String; // false

4.6 조건 표현식 (삼항 연산자)

  • 조건 ? 표현식1 : 표현식2; 예:
   int a = 5;
   int b = 3;
   int smallerNumber = (a < b) ? a : b; // 3

4.7 캐스케이드 표기법

  • 연산자를 사용하여 한 객체로 연속적인 멤버 호출을 수행할 때 사용합니다. 객체를 반복해서 참조하는 불필요한 과정을 줄일 수 있습니다. 예:
   class Person {
     String name = '';
     int age = 0;
   }

   void main() {
     var person = Person()
       ..name = 'John'
       ..age = 30;
     print(person.name); // John
     print(person.age); // 30
   }

다트 조건문과 반복문 (Control Flow)

4.1 조건문

  • if: 조건이 참인 경우에 블록을 실행
  • if-else: 조건이 참이면 첫 번째 블록을, 그렇지 않으면 두 번째 블록을 실행
  • switch: 다양한 조건 값을 기반으로 다른 작업을 수행 예:
   int score = 85;

   if (score >= 90) {
     print('A');
   } else if (score >= 80) {
     print('B');
   } else {
     print('C');
   }

   // switch 문
   int choice = 2;
   switch (choice) {
     case 1:
       print('Option 1');
       break;
     case 2:
     case 3:
       print('Option 2 or 3');
       break;
     default:
       print('Default Option');
   }

4.2 반복문

  • for: 지정된 횟수만큼 반복
  • while: 조건이 참인 동안 반복
  • do-while: 조건이 참인 동안 반복 (최소 한 번 실행) 예:
   // for 문
   for (int i = 0; i < 5; i++) {
     print('Iteration $i');
   }

   // while 문
   int count = 0;
   while (count < 3) {
     print('Count: $count');
     count++;
   }

   // do-while 문
   int number = 5;
   do {
     print('Number: $number');
     number--;
   } while (number > 0);