본문 바로가기

# 02/Flutter

[Flutter] Flutter가 Dart 언어를 사용 하는 이유!

반응형

Dart 는 2011 년 동적으로 유형이 지정되는 언어인 JavaScript 를 대체 하기 위해 구글이 만들었다고 한다.

 

하지만, 

 

TypeScript 등 다른 언어의 등장으로 대체되지 못했고 Dart 만으로 이루어진 구현체가 마땅히 없어 

인기를 끌지 못했다고 한다.

 

2018년 Flutter 의 언어로 채택 되어 현재는 많은 주목을 받고 있다.

 

 

Dart 의 특징

 

Dart는 객체 지향 언어이다. 모든 것들을 전부 오브젝트로 취급한다.

 

Variable 안에 넣을 수 있는 것은 전부 오브젝트 이고 Function, number, null 전부 오브젝트로 취급한다.

 

변수에 넣을 수 있는 모든 것은 객체이며, 모든 객체는 클래스의 인스턴스로 취급한다. 

 

클래스와 객체를 사용하여 코드를 재사용 할 수 있다. 

 

 

Dart 는 정적인 언어로 유형이 지정되는 특징이 있다.(Strong Typing) 즉, 변수와 객체는 특정 유형으로 선언되어야 하며 런타임 중에 유형을 변경할 수 없다.

 

 

Dart는 고성능 크로스 플랫폼 모바일 앱을 구축하는 데 사용되는 Flutter 프레임워크에서 애플리케이션을 개발하기 위한 기본 언어이다.

 

 

Dart는 Future 및 Stream 을 사용하여 비동기 프로그래밍을 지원하므로 응답성이 뛰어나고 확장 가능한 애플리케이션을 더 쉽게 작성할 수 있다.

 

 

Dart는 특히 Java, C# 및 JavaScript와 같은 다른 인기 있는 프로그래밍 언어에 익숙한 개발자를 위해 쉽게 배울 수 있도록 설계 되었다.

 

 

Dart에는 성장하는 개발자 커뮤니티와 라이브러리 및 패키지의 대규모 에코시스템이 있어 일반적인 문제에 대한 솔루션을 쉽게 찾고 필요할 때 도움을 받을 수 있다.

 

 

 

Flutter가 Dart 언어를 사용 하는 이유!

 

두 가지 컴파일 방법을 지원한다. (JIT + AOT)

 

Flutter 를 빌드할 때 3가지 모드 (Debug, Profile, Release) 가 있고 개발 단계에 따라 이러한 컴파일 모드 중에서 선택할 수 있다.

 

- Debug 모드 : 이 모드에서는 물리적 장치, 앱 또는 시뮬레이터에서 앱을 디버깅 할 수 있다. 어센셜 및 서비스 확장이 여기에서 활성화 된다. 그런 다음 컴파일을 최적화 하여 빠른 배포가 이루어 진다.

 

- Profile 모드 : 이 모드에서는 테스트 하는 동안 앱의 성능을 분석하기에 충분한 디버깅 기능이 유지 된다. 이 경우 추적 및 일부 확장이 활성화 된다. 에뮬레이터 또는 시뮬레이터 에서는 해당 동작이 실제 성능을 재현하지 않기 때문에 프로필 모드가 비 활성화 된다.

 

- Release 모드 - 앱을 배포할 때 footPrint 의 크기를 최대한 최적화 하기 위해 사용된다. 여기에서는 디버깅, 어센셜 및 서비스 확장이 비활성화 된다. 더 빠른 시작 더 빠른 실행 및 더 작은 크기가 핵심 기능이다.

 

Debug 모드에서 사용하는 컴파일러가 JIT 방식이고 Release 모드에서 사용하는 컴파일러가 AOT 방식이다.

 

JIT - Just In Time 컴파일러는 프로그램 실행 중에 즉시 컴파일이 가능하다. 빠른 개발주기로 개발이 가능하다. 단 실행 중에 컴파일이 되기 때문에 실행 속도는 느리다. 

 

AOT - Ahead of time 컴파일러는 프로그램 작성 중 (런타임 이전에) 컴파일을 실행한다. Dart 는 운영체제에 맞게 미리 컴파일을 한 후 집어 넣을 수 있고 가상머신을 사용하지 않으므로 속도가 매우 빠르다. 런타임 에는 분석 및 컴파일을 위해 일시 중지하지 않아서 보다 예측 가능한 프로그램을 만들 수 있다.

 

따라서 개발을 할 때는 JIT 방식인 Debug 모드로 빠른 개발을 할 수 있고 출시 할 때는 AOT로 컴파일 하여 실행 속도를 올려줄 수 있다.

 

결과적으로 Dart는 매우 빠른 개발 주기와 빠른 실행 및 시작 시간이라는 두 가지 이점을 모두 제공할 수 있다.

 

 

 

핫 리로드!!

 

Flutter의 가장 인기 있는 기능 중 하나는 바로 핫 리로드 이다.

 

Flutter는 개발 중에 Debug 모드로 실행하여 JIT 컴파일러를 사용하면 일반적으로 1초 동안 코드를 다시 로드하고 계속 실행할 수 있다. 

(Release 모드와 Profile 모드로 빌드하면 핫 리로드를 사용할 수 없다.)

 

앱 상태는 가능할 때마다 Reload를 통해 유지되므로 앱이 중단된 시점부터 계속 할 수 있다.

 

플러터 개발하다가 네이티브 개발하면 속터지는 경험을 할 수 있다. (매우 동의한다!)

 

실행의 최소 단위 시간을 타임퀌텀 또는 타임슬라이스 라 하는데 이를 기준으로 하여서 정해진 시간마다 CPU를 할당하고 그 시간이 지나면 다음 프로세스를 타임퀀텀만큼 CPU를 할당한다.

 

 

 

초당 60 프레임의 훌륭한 애니메이션

 

Flutter 는 아름답고 훌륭한 애니메이션을 쉽게 만들 수 있다. jank 를 유발하는 일반적인 것들을 피할 수 있다.

 

60 fps 로 실행되는 Flutter 의 UI는 아주 매끄럽게 보인다.

 

리액트 네이티브 처럼 브릿지를 사용하지 않고 Flutter는 직접 프레임 워크단에서 UI를 그리기 때문에 다른 크로스 플랫폼 보다 빠르다.!!

 

 

 

선제적 스케줄링, 타임 슬라이싱 및 공유 리소스

 

Java, Kotlin, Objective-C, Swift 등 여러 개의 동시 실행 스레드를 지원하는 대부분의 프로그래밍 언어는 선점 기법을 사용하여 스레드 간에 전환한다.

 

각 스레드에는 실행시간이 ‘슬라이스’로 할당되고 할당된 시간을 초과하면 다른 스레드로 넘어간다. 그러나 메모리와 같은 스레드 간에 공유

 

되는 리소스를 업데이트할 때 선점이 발생하면 경쟁조건이 발생한다.

 

경쟁 조건은 앱 충돌 및 데이터 손실을 포함한 심각한 버그를 유발할 수 있다.

 

경쟁조건을 해결하는 일반적은 방법은 다른 스레드가 실행되지 않도록 Lock을 걸어 공유 리소스를 보호하는 것이다.

 

그러나 Lock은 더 심각한 교착상태, 기아상태를 유발할 수도 있다.

 

Dart 는 이 문제에서 다른 접근방식으로 접근한다.

 

isolates라고 하는 다트의 스레드는 메모리를 공유하지 않으므로 Lock이 필요하지 않다.

 

isolate는 채널을 통해 메시지를 전달하여 통신한다.

 

Dart는 기본적으로 단일 스레드에서 작동하므로 선점을 허용하지 않는다.

 

대신 스레드는 명시적으로 산출한다. (async / await , Futures or Stream 사용)

 

이를 통하여 개발자는 실행을 보다 효과적으로 제어할 수 있다.

 

단일 스레딩을 통해 개발자는 중요한 기능 (애니메이션 및 전환 포함)이 선점 없이 완료될 때까지 실행할 수 있다.

 

 

 

Lock 없이 객체 할당 가비지 수집 가능

 

성능에 영향을 끼치는 심각한 원인 중 하나는 바로 가비지 컬렉션 이다.

 

가비지 컬렉션은 공유 리소스(메모리)에 엑세스 하는 특별한 경우이며, 많은 언어에서 수행기간 동안 잠금을 사용해야 한다.

 

잠금 되어 사용 가능한 메모리가 수집되는 동안 전체 앱 실행이 중지될 수도 있다.

 

하지만 Dart는 항상 가비지 컬렉션을 잠금 없이 수행할 수 있다.

 

Dart는 generational 가비지 컬렉션 및 allocation scheme을 사용한다.

 

이 기법은 특히 수명이 짧은 많은 객체들을 할당하는 데 더 빠르다.

 

(모든 프레임에 대해 불변의 뷰 트리를 재구성하는 Flutter와 같은 반응적인 사용자 UI에 적합)

 

 

 

선언적인 방식의 레이아웃

 

Flutter는 명령적인 방식이 아닌 선언적인 방식으로 UI를 작성한다. 때문에 레이아웃을 매우쉽게 읽고 시각화 할 수 있다.

 

Flutter는 JSX나 XML 같은 별도의 선언적 레이아웃 언어를 사용하지 않고 오로지 Dart 로 구현한다.

 

Flutter는 선언형 프로그래밍 방식을 사용하여 위젯을 변경해야 하는 상황이 생길 때 기존의 것을 변경하는 것이 아니라 지우고 새로 다시 만든다.

 

선언형 프로그래밍 방식을 사용할 때는 다음과 같은 장점이 있다.

 

  • 가독성
  • 재사용성
  • 오류 복구 : 특정 부분만 오류 체크할 수 있음
  • 참조 투명성 : 다른 시스템에 영향을 주지 않음
  • 대체 가능성

 

 

 

 

 

 

 


https://beomseok95.tistory.com/315

 

Flutter(플러터)가 Dart(다트)언어를 사용하는 이유

Flutter(플러터)가 Dart(다트) 언어를 사용하는 이유 오랜만의 포스팅으로 돌아왔습니다! 이 글에서는 Flutter가 Dart언어를 어째서 사용하는지 이유에 대하여 알아보도록 하겠습니다. Flutter(플러터)와

beomseok95.tistory.com

https://inherited.tistory.com/16

 

왜 Flutter는 Dart를 사용하는가?

본문은 이 글( https://hackernoon.com/why-flutter-uses-dart-dd635a054ebf) 을 번역한 것으로, 저자에게 게시 동의를 얻었습니다. 다만 글 작성 후 시간이 꽤 지났고 그 사이에 몇가지 Dart의 새로운 기능들이 추

inherited.tistory.com

https://chat.openai.com/chat

 

반응형