Dart 기초 문법

Updated:


1.변수 선언법

void main() {
  var name = 'test code';

  print(name);
}
  • 변수 선언은 var 이름은 name value 는 test code 가 됩니다.

2.변수 타입

  • var 로 변수 선언할때 타입을 모를때 쓰는거고, 각 타입별로 변수 타입이 있습니다.

정수 선언

void main() {
  int number1 = 12;
  print(number1);

  int number2 = 38;
  print(number2);

  print(number1 + number2);
  print(number1 - number2);
  print(number1 * number2);
  print(number1 / number2);
}

실수 선언

  • 실수는 정수와 다르게 소수점을 사용할 수 있는 숫자

  • 주의 할 점은 정수는 실수에 포함되기 때문에 double 은 int 대시에 사용해도 된다 단! int 인 정수는 소수점이 있는 실수로 사용이 안됩니다.

void main() {
  double number3 = 2.5;
  double number4 = 0.5;
  print(number3);
  print(number4);

  double number5 = 12;
}

문자 선언

  • String 은 시작할때 대문자로 시작해야 합니다

  • 기본적으로 사칙연산은 안되지만, + 하게 되면 string 을 합칩니다

void main() {
  String name = 'hello';
  String name2 = ' world';

  print(name + name2);
  // + 말고도 $ 사용해서 변수로 인식해서 붙일 수 있음
  print('$name$name2'); // hello world

  // string 말고도 number 도 $ 를 이용해서 붙여서 사용할 수 있습니다
  int age = 30;
  String sentence = '나의 나이는 $age 입니다';
  print(sentence); // 나의 나이는 30 입니다
}

Boolean 선언

  • dart 에서는 줄여서 bool 이라고 쓰입니다
void main() {
  // Boolean
  bool isTrue = true;
  bool isFalse = false;
  print(isTrue); // true
  print(isFalse); // false
}

var, dynamic 타입 선언

  • 타입을 선언하지않고서 자유롭게 사용할 수 있는 type을 var 입니다.

  • 처음 var 가 선언이 되면 그 타입으로 인식하기 때문에 나중에 다른 타입으로 바꾸려고 하면 type error 가 발생됩니다.

void main() {
  var name = 'Jacob';
  print(name);
  var number = 5;
  // 이미 var number 는 int 타입으로 지정되기 때문에 type error
  number = 'Mike' // 타입 error


  // dynamic 은 var 와 다르게 type을 저장하지 않기 때문에 나중에 선언된 타입으로 변수의 타입이 전환 됨
  dynamic name2 = 'John';
  name2 = 5;
  print(name2); // 5 로 잘 출력이 됨

  // 참고! dymamic 은 type 에 혼선이 있기 때문에 flutter 에서는 dynamic 은 거의 안쓰임 var 도 잘 안쓰임

  // 만약 var 가 value 값이 선언이 안될을 경우, 나중에 값을 넣을때 string, int 등 상관없이 value 값이 사용될 수 있다 (마치 dynamic 처럼.) 거의 사용되지 않긴 함
  var name3;
  name3 = 'Emma';
  name3 = 1;
  print(name3); // 1
}
  • 모든 변수를 type 에 상관 없이 var 로 진행 해도 상관 없긴 하지만, 실제 프로젝트에서는 var 는 거의 사용되지 않는다. 왜냐하면, 코드의 양이 많이 질 경우 type 에 혼선이 되기 때문에 직접적으로 int, double, String, bool 으로 사용함

3.List

void main() {
  // list 선언하는 2가지 방식
  List number1 = [];
  // List number2 = new List();

  //  list 에 값 넣기
  number1.add(1); // 1추가
  number1.add(2); // 2추가
  number1.add(3); // 3추가

  print(number1[1]); // 2 출력

  // list 에 값 빼기
  number1.removeAt(2); // number1 의 2번 인덱스 인 3이 삭제
  print(number1); // [1, 2] 출력

  // list 에 값 수정
  number1[0] = 99;
  print(number1); // [99, 2] 출력

  // list 에 type 선언 어떠한 type 이 들어갈지 미리 지정을 해놓으면 그 타입만 들어가게 됨
  List<String> name = [];
  name.add('Jacob');
  print(name); // [Jacob] 출력
  // name.add(1); // parameter 가 String 만 되어야 되서 error 발생

  // value 값을 지정해서 선언
  List<String> people = ['Jacob', 'Emma', 'John'];
  print(people);

  // list 의 길이
  print(people.length); // 3
}

4.Map

  • key, value 의 값을 가지고 pair 의 구조입니다.

  • 값을 변경할때는 list 는 index를 사용하지만, map 은 key 값을 사용합니다

void main() {
  // Map 선언
  Map dic = {'apple': '사과', 'bananna': '바나나', 'melon': '멜론'};
  print(dic); // {apple: 사과, banana: 바나나, melon: 멜론}
  print(dic['apple']); // 사과

  // empty map 생성 후에 값 집어 넣기
  Map dic2 = {};
  dic2.addAll({'apple': '사과', 'bananna': '바나나', 'melon': '멜론'});
  print(dic2);

  // map 에서 지우기
  dic2.remove("apple");
  print(dic2); // {banana: 바나나, melon: 멜론}

  // map 에서 값 변경하기
  dic2['banana'] = '바나나 아님';
  print(dic2); // {banana: 바나나 아님, melon: 멜론}

  // map 선언하는 다른 방법
  Map dic3 = new Map.from({
    'apple': '사과',
    'banana': '바나나',
  });
  print(dic3); // {apple: 사과, banana: 바나나}

  // key, value 값만 출력하기 (list로 변환)
  print(dic3.keys.toList()); // [apple, banana]
  print(dic3.values.toList()); // [사과, 바나나]

  // Map 에서 type 지정
  // list나 map 에서 아래와 같이 항상 type 을 지정해 주고 사용하는 것을 추천함
  Map<String, int> price = {
    'apple': 2000,
    'bananna': 4000,
    'melon': 6000,
  };
  print(price); // {apple: 2000, bananna: 4000, melon: 6000}

  // map 에서의 key 는 절대적으로 unique 해야 됨, 똑같은 key 값이 중복되서 사용될 수 없다. 즉 map 에서 key 값은 고유 하나의 값밖에만 있어야 함
}

5.변수에 대한 몇가지 rule

  • 변수의 타입이 같던 다르던 같은 이름의 변수는 선언할 수 없습니다

  • 변수의 시작은 소문자로 시작합니다

  • 변수안에는 띄어 쓰기가 안됩니다 (camelCase 로 사용)

  • 변수명에 _ (underscore) 를 앞에 사용해서 선언 할 수 있는데, class 에서 private 변수가 있는데 사용됩니다

  • class 를 선언할 때는 대문자로 시작해서 변수를 선언합니다

6.Final, Const

  • 둘다 공통적으로 변수를 선언하고나서, 선언된 변수가 변경되지 않도록 하는 기능입니다.

  • 두가지의 큰 차이점은 const 컴파일 타임에 값이 지정이 되어 있어야 하고, final 은 런타임 상태에서도 값이 지정되어 있어야 합니다

  • 일반적인 상황에서는 런타임 상태에서도 사용이 가능한 final 을 주로 사용합니다.

void main() {
  // final: 변수의 값이 변경되지 않게 하는것
  final String name = 'Jacob';

  // name = 'Emma'; // error 발생 변수 마꾸는것 못함

  // final 은 런타임의 값이 지정이 되어도 상관이 없음
  // dateTime 함수 코드가 실행되는 순간에 시간을 나타냄
  final DateTime now = DateTime.now();
  print(now);

  // 1초뒤에 실행 하는 함수
    Future.delayed(Duration(milliseconds: 1000), () {
    final DateTime now2 = DateTime.now();
    print(now2);
  });


  // const는 compile 할때 시점을 알아야 되기때문에 현재 DateTime.now() 의 값을 현재 시점에서 알수 없기 때문에 const는 사용할 수 없음
  // dateTime 함수 코드가 실행되는 순간에 시간을 나타냄
  const DateTime now3 = DateTime.now();
  print(now3);

  // 1초뒤에 실행 하는 함수
    Future.delayed(Duration(milliseconds: 1000), () {
    const DateTime now4 = DateTime.now();
    print(now4);
  });
}

7.Operator

void main() {
  // 사칙 연산
  int number = 2;
  print(number + 2); // 4
  print(number - 2); // 0
  print(number * 2); // 4
  print(number / 2); // 1.0

  print('---------');

  // 나머지 값 (배수 값 구할때 사용 나머지값이 0일경우에 사용)
  print(number % 3); // 2

  // ++, --
  number++;
  print(number); // number + 1 = 3
  number--;
  print(number); // number - 1 = 2

  print('---------');

  //  += , -=, *=,
  number += 3;
  print(number); // number + 3 = number

  //  /=  나누기를 하게되면 dart 에서는 변수 타입이 double 로 인식을 하게 됨 그래서 나누기를 하려면 int 를 사용하면 안됨

  // 비교 연산자
  int number1 = 1;
  int number2 = 2;
  print(number1 <= number2); // true
  print(number1 >= number2); // false
  print(number1 == number2); // false 같은거 비교
  print(number1 != number2); // true 다른거 비교

  // type 비교
  print(number is int); // ture 타입의 같은것을 비교
  print(number is String); // False
  print(number is bool); // False
  print(number is! String); // ture 다른것 비교

  // 논리 operator

  // && and ,  || or
  bool result = 2 > 10 && 1 > 0;
  print(result); // false

  bool result2 = 2 > 10 || 1 > 0;
  print(result2); // true
}

8.조건문(if, switch)

if문

void main() {
  // 4의 배수인지의 조건문
  int number = 21;
  if (number % 4 == 0) {
    print('4의 배수 입니다');
  } else if (number % 4 == 1) {
    print('나머지가 1입니다');
  } else {
    print('해당조건에 맞지 안습니다');
  }
}

switch 문

void main() {
  // 4의 배수인지의 조건문
  int number = 21;
  switch (number % 4) {
    case 0: // 값이 0일 경우
      print('4의 배수 입니다');
      break; // case 에 해당되었을때 switch 문을 빠져나오라는 것 꼭 break 를 사용해야 함 switch 문에서는

    case 1:
      print('나머지가 1입니다');
      break;

    case 2:
      print('나머지 2입니다');
      break;

    default:
      print('어떠한 조건에도 맞지 않습니다.');
  }
}

  • if 경우 좀 복잡한 연산 할때 자주 사용되고 switch 는 단순한 조건문일때 사용됩니다. switch 는 추가적인 조건을 넣지 못합니다. 대신, switch 문이 응답속도는 더 빠르게 작동 합니다.

9.반복문 for, while

for loop

void main() {
  // 0부터 9까지 반복 출력
  for (int i = 0; i < 10; i++) {
    print(i);
  }

  // 리스트의 합을 구하기
  List<int> numbers = [1, 2, 4, 5, 6, 8, 9];
  int sum = 0;

  for (int i = 0; i < numbers.length; i++) {
    sum += numbers[i]; // number 에 합을 누적
  }
  print(sum); // 35

  // for in : index 없이 값만 가지고 for loop 돌릴때 잘 사용됨
  int total = 0;
  for (int number in numbers) {
    total += number;
  }
  print(total); // 35
}

while

void main() {
  // while loop : 해당 조건이 ture 일 동안 계속 반복 하는것
  // while 무한으로 돌지 않게 주의 할 것
  int number = 10;
  while (number < 20) {
    print(number); // 10 ~ 19
    number++;
  }

  // do while : 조건이 나중에 계산을 함
  do {
    print(number);
    number++;
  } while (number < 20);
}

break, continue

void main() {
    // break 는 조건에 해당되면 while loop 를 종료 시켜 버림
  while (number < 20) {
    print(number);
    number++;

    if (number == 15) {
      break;
    }
  }

  for (int i = 0; i < 10; i++) {
    print(i);
    if (i == 5) {
      break;
    }
  }

  // continue 는 건너뛰고 계속 하라는것임 스킵임
  for (int i = 0; i < 10; i++) {
    if (i == 5) {
      continue;
    }
    print(i); // 5가 skip 이 되고 0 ~ 9 까지 출력
  }
}

10.Enum

  • enum 을 사용하면 한정된 option 을 효율적으로 사용할 수 있게 됨
// enum 을 사용해서 그 값을 정해 놓고 그것을 꺼내서 사용함
enum Status {
  approved,
  rejected,
  pending,
}

void main() {
  // approved, rejected, pending 상태가 있을때
  String status = 'approved';

  // approve 라고 스펠링 error 가 되었을때 if 문이 false 가 되기때문에 else 로 넘어감
  if (status == 'approve') {
    print('승인되었습니다');
  } else {
    print('반려나 대기가 되었습니다');
  }

  // enum 을 사용 위험성이 적게 사용할 수 있게 됨
  Status status1 = Status.approved;

  if (status1 == Status.approved) {
    print('승인되었습니다');
  }

  print(Status.values.toList()); // [Status.approved, Status.rejected, Status.pending]
}

11.Function

void main() {
  List testList = [1, 3, 5, 8, 8];
  List testList2 = [2, 6, 7, 9, 8];
// addList 함수 실행
  // 함수에서 return 값을 result 로 변수 선언
  int result = addList(testList);
  print(result);
  addList(testList2);
}

// 함수 : 중복되는 code 를 재사용하기 위해 사용
// 함수 선언문
// return 을 할때 return 되는 값의 type 을 명시 해줘야 함
int addList(List testList) {
  int total = 0;
  for (int number in testList) {
    total += number;
  }
  print(total);
  return total;
}

optional parameter

  • parameter 을 여러개 사용할때, 함수 실행하는 부분에서 parameter 값의 위치, type 이 정확히 맞아야 하는데 만약 하나라도 빠지면 함수가 실행되지 않게 됨 그럴경우 선언부 parameter 에서 [] 로 감싸게 될경우에는 optional 이 되기때문에 함수가 그대로 실행되게 됩니다

  • optional 하게 됬는데 위에 code 처럼 b 값이 안들어올때는 null 이 되는데 만약 null 일경우에 b 의 default 값을 설정 해 줄 수 있습니다.

// b 값이 null 일때 3으로 default 값을 주는것
int addList(List testList, int a, [int b = 3]) {
  int total = 0;
  for (int number in testList) {
    total += number;
  }
  print(total);
  return total;
}

12.typedef

  • typedef 를 사용하면 함수를 signature 화해서 여러가지 함수를 유용하게 다룰수 있게 합니다.
void main() {
  Operation oper = add;
  oper(1, 3); // x + y 는 4 입니다

  oper = subtract;
  oper(4, 2); // x - y 는 2 입니다
}

// 함수를 변수처럼 사용할 수 있게 됨
typedef Operation(int x, int y);

void add(int x, int y) {
  print('x + y 는 ${x + y} 입니다');
}

void subtract(int x, int y) {
  print('x - y 는 ${x - y} 입니다');
}
void main() {
  calculate(1, 2, add); // x 더하기 y 는 3 입니다
  calculate(1, 2, subtract); // x 빼기 y 는 -1 입니다
}

typedef Operation(int x, int y);

void add(int x, int y) {
  print('x 더하기 y 는 ${x + y} 입니다');
}

void subtract(int x, int y) {
  print('x 빼기 y 는 ${x - y} 입니다');
}

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

🔶 🔷 📌 🔑

Reference

Categories:

Updated:

Leave a comment