Hits
Dart 2023. 10. 7. 오전 7:12:00

Dart 기초

"Dart 알아보기"
DartStudy

이 글은 골든래빗 <코드팩토리의 플러터 프로그래밍> 1장 써머리입니다.

Dart

Dart는 구글에서 개발한 프로그래밍 언어로 웹에서 자바스크립트를 대체하려는 시도에서 시작됐지만 실패했고, 하이브리드 모바일 어플리케이션 프레임워크 Flutter의 인기에 힘입어 급부상한 언어입니다. 2011년 개발된 언어인 만큼 현대적인 문법과 타입시스템이 적용되어 있고, JS와 Kotlin과 유사한 문법들을 갖고 있어 기존 JS개발자들이 쉽게 익힐 수 있는 언어인 듯 합니다.

개발환경에서는 VM 상에서 JIT(Just In Time) 컴파일 방식을 사용하고, 배포할 때는 AOT(Ahead of Time)방식을 사용한다고 하는데, 아직 배포는 해보지 않아서 잘 모르겠으나 개발환경에서 핫리로딩을 지원하기 때문에 편리했습니다.

기초 문법

main

C나 Java프로그래밍에서 보았던 main함수가 프로그램의 시작지점입니다.

void main() {
    // 메인 프로그램
}

주석

주석을 달 때는 위 예시 코드처럼 한줄 주석은 // 여러 줄 주석은 /* 주석 */으로 달 수 있습니다.

void main() {
    // 한 줄 주석

    /*
    * 여러
    * 줄
    * 주석
    */
}

print

코딩의 시작은 Hello World출력부터! print함수를 이용해 문자열을 콘솔에 출력할 수 있습니다.

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

변수 선언

변수를 선언하는 방법은 여러가지가 있습니다. 기본적으로는 var예약어를 사용해 변수를 선언하는 방법입니다. var를 사용하면 컴파일 시점에 타입을 추론해 해당 변수의 타입으로 치환됩니다. 이렇게 선언된 변수는 값을 재할당할 수 있지만, 다시 선언할 수는 없습니다.

void main() {
    var name = "베짱이";
    print(name); // 베짱이

    name = "42";
    print(name); // 42

    name = 42; // 타입 오류

    var name = "실패"; // 에러
}

Dart는 이렇게 정적 타입 언어의 형태를 띄지만 동적 타입 형태로 코딩할 수도 있습니다. dynamic을 사용하는 방법입니다. 앞선 var의 사용에서는 처음 선언한 name이 String으로 추론됐기 때문에 String타입으로 고정돼 42라는 정수형으로 변경할 수 없었습니다. 하지만 dynamic을 사용하면 가능합니다. 다만 그만큼의 위험성을 안고있기 때문에 저는 잘 쓰지 않을 것 같습니다.

void main() {
    var name = "베짱이";
    name = 42;
}

값을 변경할 수 없는 상수를 선언할 수도 있습니다. finalconst를 사용하면 됩니다. 둘의 차이는 final은 런타임에서, const는 빌드타임에서 값이 고정된다는 겁니다. DateTime처럼 런타임에 값이 나타나는 변수에 const를 사용하면 제대로된 날짜 출력을 할 수 없겠죠.

void main() {
    final DateTime finalNow = DateTime.now(); // 실행시점의 날짜, 시간
    const DateTime constNow = DateTime.now(); // 에러
}

마지막으로 다른 정적타입언어들처럼 변수 타입 명시를 통해 변수를 선언할 수 있습니다. 앞선 var는 값을 통해 타입을 추론했지만 이 방법은 개발 시점에 명시적으로 타입을 지정합니다.

void main() {
    String name = "베짱이";
    int number = 42;
}

컬렉션

Dart에 컬렉션은 List, Map, Set 세 가지 타입이 있습니다. JS로 친다면 각각 Array, Object, Set으로 볼 수 있겠습니다.

List

여러 값을 순서대로 저장하는 배열 형태의 자료형.

  1. add() - 값 추가
  2. where() - 배열을 순회하며 필터링. Iterable 반환
  3. map() - 배열을 순회하며 값 변경. Iterable 반환
  4. reduce() -
  5. fold() -

Map

key, value를 이용해 값에 빠르게 접근 가능한 자료형

Set

중복요소를 제거한 배열 형태 자료형

enum

선택지를 미리 지정하고 자동완성을 이용해 보다 편리하게 사용가능한 타입

기본 연산자

기본 수치 연산자

+, -, *, /, % 사용 가능.

다른 언어와 마찬가지로 덧셈 뺄셈 곱셈 나눗셈 나머지 연산 지원.

++, --를 통해 단항 연산 가능하고, +=, -=등의 연산 할당 가능.

void main() {
    int a = 1; // 1

    print(a + 1); // 2
    print(a - 1); // 0
    print(a * 2); // 2
    print(a / 2); // 0
    print(a % 2); // 1

    print(a++); // 2
    print(a--); // 1

    int b += 1;
    print(b); // 2
    int c -= 1;
    print(c); // 0
    int d *= 2;
    print(d); // 2
    int e /= 2;
    print(2); // 0
    int f %= 2;
    print(2); // 1
}

null 연산자

flutter 2.0부터 null safety 지원. Kotlin과 유사.

자료형 뒤에 ?를 붙여 nullable 선언 가능. var도 null 입력 가능.

void main() {
    int? a;

    print(a); // null

    int b; // 오류
}

??

연산자 앞의 값이 null이면 뒤의 값 사용

void main() {
    int? a;
    print(a ?? 2); // 2

    int? b = 1;
    print(b ?? 2); // 1
}

??=

null이면 할당

void main() {
    int? a;
    print(a); // null

    a ??= 2;
    print(a) // 2

    a ??= 3;
    print(a); // 2
}

?.

null safety navigator. 값이 null이 아닐때만 속성, 메소드에 접근

class Number {
    int one() {
        return 1;
    }
}

void main() {
    Number? number;
    print(number.one); // 오류
    print(number?.one); // null
    print(number!.one);
}

!.

nullable값의 non-null임을 보증. 어떤 상황에도 객체가 null이 아닐것이 확실할 때만 사용.

비교 연산자

<, >, <=, >=, ==, !=

논리 연산자

||(OR), `&&``(AND)