Programming/Flutter

Flutter 학습 전 Dart 언어의 특징 살펴보기

Jan92 2023. 8. 29. 21:56

Dart 언어의 특징 살펴보기

dart and flutter

해당 포스팅은 Flutter 학습 전 'Dart 언어에 대한 특징'을 살펴보며 정리한 내용입니다.

 


Dart와 Flutter

'Dart'는 구글이 JavaScript를 대체하기 위해 2011년 개발한 웹 프로그래밍 언어인데요.

'세련되지 않은 언어적 특성과 높은 러닝 커브', 'TypeScript 등 JavaScript를 대체할 수 있는 다른 언어의 등장', 'Dart로 이루어진 구현체가 없다는 점' 등의 이유로 인해 좋은 평가를 받지 못했습니다.

(심지어 2018년에는 배울 필요가 없는 프로그래밍 언어 1위를 차지하기도 했었습니다.)

 

하지만 2017년 구글에서 클로스 플랫폼 앱 프레임워크인 'Flutter'를 발표한 이후 상황이 바뀌기 시작했습니다.

플러터의 가장 큰 장점은 '크로스 플랫폼 앱 프레임워크' 즉, 하나의 코드 베이스로 Android, iOS, Web, Desktop 등을 모두 개발할 수 있다는 것인데요.

(각각의 플랫폼에 대해 100% 완벽한 지원을 하는 것은 아니지만, 요즘처럼 앱의 변화 속도가 빠르고 개발자의 인건비가 높아 여러 명을 채용하기 어려운 상황에서의 장점으로 부각되고 있습니다.)

 

Flutter 개발을 위한 언어로 Dart가 채택되었고, 그러면서 Dart는 Flutter와 함께 시장에서 관심을 받게 되었습니다.

(2023년 5월 기준 Dart 3까지 발표되었습니다.)

 

 

***

Flutter와 Dart 모두 구글에서 만들어졌기 때문에, 구글은 Flutter를 위해 Dart를 최적화할 수 있다는 점이 다른 언어들과 비교했을 때 장점으로도 느껴졌습니다.

(Django에서 Python을 수정할 수 없으며, React에서 JavaScript를 수정할 수 없습니다.)

 

 

추가로 구글에서는 '퓨시아(Fuchsia)'라고 하는 차세대 OS를 개발 중이라고 2016년 처음 공개했는데요.

Fuchsia는 스마트 기기를 넘어서 IoT 등, 모든 기기에서 돌아갈 수 있는 운영체제를 목표로 하고 있으며, 퓨시아의 메인 개발 환경이 Flutter이기 때문에 Dart 역시 프로그래밍 언어로서의 입지가 더 확장될 수 있다는 가능성을 가지고 있습니다.

 

 


Dart 언어의 특징

 

1. 객체 지향 프로그래밍 언어

Dart는 객체를 기반으로 하는 '객체 지향 프로그래밍 언어'입니다.

모든 객체는 클래스의 인스턴스이며, null을 제외한 모든 클래스는 Object를 상속받습니다.

(Flutter 역시 객체 지향 프레임워크입니다.)

 

기본적으로 C나 Java와 닮은 점이 많기 때문에 기존의 개발자들에게 언어적 진입 장벽이 낮다는 것이 큰 장점인데요.

실제 Java를 사용하는 입장에서 Java 보다는 Kotlin에 더 가까운 것 같다고 느꼈습니다.

 

 

 

2. 컴파일러

dart compiler

다트는 플랫폼에 대한 컴파일러(Dart Native, Dart Web)를 각각 제공하며 내용은 아래와 같습니다.

 

 

Dart Web

Dart Web을 사용하면 Dart 코드를 JavaScript 코드로 컴파일할 수 있으며, 이를 통해 웹 플랫폼에서 해당 코드를 실행할 수 있게 됩니다.

 

 

Dart Native

Dart Native는 Dart 코드를 ARM32, ARM64(대부분의 모바일 기기에서 사용), x86_64(데스크톱에서 사용)와 같은 여러 CPU 아키텍처에 맞게 변환해 주는데요.

이를 통해 iOS, Android, macOS, Windows, Linux 등 여러 환경에서 실행되는 애플리케이션 또는 프로그램을 개발할 수 있습니다.

 

또한 Dart Native는 'JIT 컴파일러''AOT 컴파일러'를 모두 사용한다는 특징이 있는데요.

먼저 'JIT(Just-In-Time) 컴파일러'Dart VM을 사용하여 작성한 코드를 런타임 시에 바로 컴파일하는 방식이며, 코드가 가상 머신을 통해 작동되기 때문에 조금 느리다는 특징이 있지만, 바로 결과를 확인할 수 있다는 점에서 매우 효율적인 방식입니다.

(Flutter의 hot-reload 기능이 JIT 컴파일러를 통해 사용할 수 있는 기능입니다.)

 

'AOT(Ahead-Of-Time) 컴파일러'의 경우 컴파일을 완료한 뒤에 실행하는 방식입니다.

컴파일 프로세스가 오래 걸릴 수 있지만, 컴파일 완료된 뒤 실행되기 때문에 JIT에 비해 실행 속도가 더 빠르다는 특징이 있습니다.

 

***

즉, Dart Native의 경우 개발 중에는 매번 컴파일할 필요 없이 JIT를 통해 작성한 코드에 대한 결과를 빠르게 볼 수 있으며, 이후 실제 앱을 배포할 때는 AOT를 통해 컴파일 후 앱을 동작시킴으로써 빠른 속도를 보장할 수 있게 되는 것입니다.

(해당 방식은 모바일 개발에서 특히 강점이 되고 있습니다.)

 

 

 

3. null safety

null safety란 말 그대로 null로부터 안전한 프로그램 코드를 작성하는 것을 의미하는데요.

(런타임 시 발생할 수 있는 NullPointerException 예외를 대비할 수 있습니다.)

 

기본적으로 dart의 모든 변수는 null이 될 수 없으며, 만약 null을 표현하고 그것이 유효한 상태라는 것을 나타내고 싶을 때는 아래와 같이 '?'를 통해 null이 될 수 있다는 것을 명시할 수 있습니다.

void main() {
  String? name = 'jan';
  name = null;
}

 

 

 

4. 동적 타입(var, dynamic)을 지원하는 정적 타입 언어

dart는 컴파일 시점에 데이터의 타입을 확인하는 정적(static) 타입 언어입니다.

하지만 필요한 경우 var 또는 dynamic을 통해 동적 type으로도 사용이 가능한데요.

 

void main() {
    var name = 'jan';
    String name = 'jan';
}

Class 변수나 property를 선언할 때는 타입을 지정해야 하며, 함수 또는 메서드 내부에서 지역 변수를 선언할 때는 var를 사용할 수도 있습니다.

(var는 초기화 시 타입 추론을 통해 하나의 타입으로 지정됩니다. 즉, 타입이 지정된 이후 다른 타입으로의 변경은 불가합니다.)

 

 

void main() {
    dynamic name;
    name = 'jan';
    name = 100;
    name = true;
}

var는 초기화 시 타입 추론을 통해 하나의 타입으로 지정되는 반면, dynamic의 경우 예시와 같이 초기화가 된 이후에도 타입에 대한 제약 없이 사용할 수 있습니다.

json 형식의 데이터나 변수가 어떤 타입인지 알 수 없는 경우에 사용할 수 있으나, 타입 안전성이 낮아지기 때문에 사용이 추천되지는 않습니다.

(사용한다면 꼭 필요한 경우에만 사용하는 것이 좋습니다.)

 

 

 

4. Isolates

Dart Isolates

Dart는 싱글스레드를 기반으로 동작하는 언어인데요.

'Isolate'를 통해 동시성에 대한 고유한 접근 방식을 제공하여 개발자가 공유 메모리 없이 병렬 작업을 실행할 수 있도록 합니다.

 

Isolate는 코드가 동작하는 context의 단위로 볼 수 있으며, 각 Isolate는 고유한 'memory heap'이 존재합니다.

다른 Isolate의 memory에 접근할 수 없기 때문에 멀티스레드 환경에서 주의해야 하는 공유 자원에 대한 문제가 발생하지 않는다는 장점이 있습니다.

 

Isolate에는 'Event loop''Event queue'가 존재하며, Event loop는 Event queue에 있는 작업들을 오래된 순서로 하나씩 가져와서(FIFO) 처리합니다.

그리고 만약 하나의 작업을 여러 개의 Isolate를 통해 처리하고 싶을 때는 'Message'를 이용하여 Isolate 간의 통신을 할 수 있습니다.

(이론적인 내용이다 보니 대략적인 흐름만 이해가 가는데, 나중에 실제로 코드를 짜보면 조금 더 감이 올 것 같습니다.)

 

 

 

 

여기까지 Flutter 학습 전 Dart 언어에 대한 특징을 간단하게 정리해 보았는데요.

잘못된 부분이 있을 경우 댓글 남겨주시면 확인하여 수정하도록 하겠습니다. 감사합니다.

 

 

< 참고 자료 >

https://medium.com/flutter-korea/왜-flutter는-dart를-사용하는가-e838b9415f57

https://couldi.tistory.com/22

'Programming > Flutter' 카테고리의 다른 글

Mac Flutter 설치 및 개발 환경 세팅  (0) 2024.04.25
Dart Class 기본적인 사용법 정리  (0) 2023.09.24