플러터 (flutter)

Dart의 기본 (1) - 프로젝트1_1

CreatoMaestro 2023. 6. 9. 23:17
반응형

Flutter 개발을 위해서는 Flutter의 기반이 되는 Dart 언어에 대해 먼저 학습해야 한다. 

이번 글에서는 Dart의 기본에 대해 학습한다.

 

Dart 프로그램 실습은 Dartpad를 이용하거나, Dart SDK를 설치하고 VScode를 통해 편집하면 된다.

(Dartpad : https://dartpad.dev)

(Dart SDK 설치 : https://dart-ko.dev/get-dart)

 

1. Dart의 기본 문법

1-1) void main과 print 함수

void main() {
  print("TI-Project-11");
}

void main은 프로그램의 시작점이다. { } 안에 원하는 코드를 넣으면 프로그램을 실행했을 때 그 코드가 실행된다.

위 예제에 있는 print 함수는 소괄호( )안에 있는 요소를 출력한다. 

프로그램을 실행하면 다음과 같은 결과가 나온다.

실행 결과
실행 결과

 

1-2) 변수 선언

void main() {
  //var 타입을 이용한 변수 선언
  var var1 = 15;
  var var2 = "Hello, world";

  print("var1 : $var1, type : ${var1.runtimeType}");
  print("var2 : $var2, type : ${var2.runtimeType}\n");

  //dynamic 타입을 이용한 변수 선언
  dynamic dyn1 = 5.6345;
  dynamic dyn2 = "Test string";

  print("dyn1 : $dyn1, type : ${dyn1.runtimeType}");
  print("dyn2 : $dyn2, type : ${dyn2.runtimeType}\n");

  //명시적 타입 지정
  int num1 = 12;
  double num2 = 3.141592;
  String str1 = "Hello, Dart!";
  bool bool1 = true;
  bool bool2 = false;

  print("num1 : $num1, type : ${num1.runtimeType}");
  print("num2 : $num2, type : ${num2.runtimeType}");
  print("str1 : $str1, type : ${str1.runtimeType}");
  print("bool1 : $bool1, type : ${bool1.runtimeType}");
  print("bool2 : $bool2, type : ${bool2.runtimeType}\n");
}

실행 결과2
실행 결과

 

Dart에서는 프로그램이 자동으로 변수의 타입을 추론하도록 할 수도 있고, 명시적으로 타입을 지정해 줄 수도 있다.

 

1) 자동으로 변수의 타입을 추론 (var, dynamic)

 var, dynamic은 받아온 값을 통해 변수의 타입 자동으로 추론하여 결정한다.

 var의 경우 한 번 타입이 결정되면 그 타입이 아닌 값은 넣을 수 없다. 

 예를 들어 a라는 변수에 12를 집어넣고, 그 뒤에 "hello"라는 값을 넣으면 오류가 생긴다.

 dynamic은 var과는 다르게 처음 지정된 타입과 다른 타입의 값이 들어와도 오류가 생기지 않는다.

 

2) 명시적으로 변수 타입을 지정

 명시적으로 변수의 타입을 지정할 수 있다. 

 대표적인 변수 타입으로는 int, double, String, bool이 있다. 

 각각 정수, 실수, 문자열, boolean을 저장할 수 있다.

 

print의 문자열 안에 '$'는 문자열 안에 변수 값을 삽입한다는 의미이다.

간단한 연산이 필요하거나, 명확한 구분이 필요한 경우 '${ }'를 사용한다.

중괄호 안에 원하는 코드를 적는다.

 

1-3) const 와 final

import 'dart:io';

void main() {
  print("Write some string");
  final String? str1 = stdin.readLineSync();
  const int num2 = 20;

  print("final str1 : $str1");
  print("const num2 : $num2");
}

print 실행 결과
실행 결과

 

const와 final은 둘 다 상수를 나타낸다.

final(or const) '변수 타입' '변수 이름' = 값; 과 같이 사용한다.

 

1) const

const는 빌드를 할 때 값이 정해진다. 

코드를 작성하고 실행하면 그 값은 변경될 수 없다.

 

2) final

final은 코드가 실행되는 동안에 값이 결정된다.

예제에서 stdin.readLineSync()는 키보드의 입력을 가져온다.

키보드에서 값을 가져오기 때문에 빌드할 때 값을 알 수 없다.

때문에 프로그램이 실행되는 동안에 값을 결정하는 final을 사용한다.

 

String 뒤에 붙은 ?는 변수 값이 'null'일 수도 있다는 것을 의미한다.

지금은 이런게 있다는 것만 알고 넘어간다.

 

1-4) List

void main() {
  List<int> list1 = [1,2,3,];
  print("list1 type : ${list1.runtimeType}");
  print("list1 element : ${list1[0]},${list1[1]},${list1[2]}\n");

  List<String> list2 = ["hello", "world", "!!"];
  print("list2 type : ${list2.runtimeType}");
  print("list2 element : ${list2[0]},${list2[1]},${list2[2]}\n");

  List<dynamic> list3 = ["hello", 13, 5.4355, true];
  print("list3 type : ${list3.runtimeType}");
  print("list3 element : ${list3[0]},${list3[1]},${list3[2]}\n");
}

list 실행 결과
실행 결과

List는 여러 요소를 하나의 변수 안에 모은다. 

저장해야 하는 값이 많을 때 사용한다.

 

저장하려는 변수 수가 적으면 하나하나 선언해 주어도 괜찮지만, 만약 50개, 100개의 값을 하나하나 선언해주어야 한다면 굉장히 불편할 것이다.

List는 이러한 수고를 줄여준다.

 

List 뒤에 붙는 <>는 배열에 저장될 변수 타입을 지정한다.

List <int>는 리스트 안에 int 타입의 변수가 들어감을 의미한다.

만약 List 안에 여러 타입의 값이 들어가야 한다면 List<dynamic>을 사용하면 된다.

 

List 안에 있는 값을 불러오고 싶을 때는 '[]'안에 index를 넣어준다.

List 안에 들어있는 요소는 각각의 index를 가지고 있고, 이는 넣은 순서에 따라 결정된다.

index는 0부터 시작한다.

위의 예제에서는 list1안에 1,2,3 순서대로 넣었으므로 1의 index는 0, 2의 index는 1, 3의 index는 2이다.

list1[0]을 호출하면 1이 반환된다.

 

1-5) Set

void main() {
  Set<int> set1 = {1, 2, 3, 3, 4}; //3이 중복됨
  print("set1 elements : ${set1}");
  Set<String> set2 = {"a", "b", "c", "d", "d"}; //d가 중복됨
  print("set2 element : ${set2}\n");
}

Set 실행 결과
실행 결과

Set은 List와 비슷한 역할을 한다. 

요소는 중괄호 '{ }'안에 넣어준다.

다만 List와는 다르게 중복되는 요소를 허용하지 않는다.

 

예제를 보면 Set 타입 변수를 선언해줄 때 3과 'd'를 두 개 넣어주었다.

하지만 print 함수를 통해 보면 하나의 3과 'd'가 하나만 있는 것을 확인할 수 있다. 

 

1-5) Map

void main() {
  // Map 변수 선언
  Map<int, String> map1 = {1: "alpha", 2: "beta", 3: "gamma"};
  print("map1 : $map1");

  //요소 추가
  map1[4] = "theta";
  map1[5] = "delta";
  print("After add element at map1 : $map1");
  print("map1 value of key 4 : ${map1[4]}");
}

Map 실행 결과
실행 결과

Map의 특징은 다음과 같다.

  • Map은 key와 value로 이루어진 배열이다.
  • Key 하나와 value 하나가 쌍으로 연결된다.
  • Key 값은 map 안에서 유일해야 한다.
  • Value는 중복될 수 있다.
  • Key에 따른 value를 보기 위해선 map[key]와 같이 호출한다.

 

2. 연산자

Dart에는 수많은 연산자들이 있다.

지금은 그 중에서 기본적인 것만 확인한다. 

2-1) 사칙연산 및 나머지 연산

기본적인 사칙연산과 나머지 연산자는 다음과 같다.

void main() {
  // 기본 사칙연산
  print(1 + 5); //덧셈
  print(1 - 5); //뺼셈
  print(4 * 5); //곱셈
  print(5 / 4); //나눗셈
  print(10 ~/ 4); //나눗셈 (몫)
  print(5 % 2); //나눗셈 (나머지)
}

사직연산자 실행 결과
실행 결과

2-2) 논리연산자

논리연산자는 식의 결과가 참인지 거짓인지 구분한다. 

void main() {
  // 논리 연산자
  print("true && true : ${true && true}");
  print("true && false : ${true && false}");
  print("true || true : ${true || true}");
  print("true || false : ${true || false}");
}

논리 연산자 실행 결과
실행 결과

반응형