# Flutter: 모던 크로스 플랫폼 개발을 위한 프레임워크

#### Flutter의 개요

Flutter는 구글(Google)에서 개발한 오픈 소스 UI 소프트웨어 개발 키트(SDK)로, 하나의 코드베이스를 통해 iOS, Android, 웹, 데스크탑 등 다양한 플랫폼에서 네이티브 애플리케이션을 개발할 수 있도록 설계되었다. 이 SDK는 특히 모바일 애플리케이션 개발을 위한 도구로 처음 등장했으나, 이후 웹과 데스크탑 지원이 추가되면서 범용적인 크로스 플랫폼 개발 프레임워크로 자리 잡았다.

Flutter의 기본적인 동작 원리는 Dart라는 프로그래밍 언어를 사용해 애플리케이션을 작성하고, 이 코드를 AOT(Ahead-Of-Time) 컴파일링하여 각 플랫폼의 네이티브 코드로 변환하는 것이다. 이를 통해 Flutter는 네이티브 성능을 유지하면서도 한 번의 개발로 여러 플랫폼에서 동작하는 애플리케이션을 만들 수 있다.

#### Widget 기반 아키텍처

Flutter의 가장 큰 특징 중 하나는 위젯(widget) 기반 아키텍처이다. Flutter에서 모든 것은 위젯으로 표현되며, UI 구성 요소뿐만 아니라 애플리케이션의 전반적인 구조까지도 위젯으로 표현된다. 위젯은 Flutter의 기본 구성 요소로서, 재사용 가능하고 계층적으로 조합될 수 있어 매우 유연한 UI 설계를 가능하게 한다.

위젯은 크게 두 가지로 분류된다. 첫째, **StatelessWidget**은 상태를 가지지 않는 위젯으로, 한번 생성되면 변경되지 않는 UI 요소를 나타낸다. 둘째, **StatefulWidget**은 상태를 가지는 위젯으로, 사용자의 상호작용이나 데이터의 변경에 따라 UI가 동적으로 변할 수 있다. 이러한 구조는 UI의 상태 관리와 변화를 효율적으로 처리할 수 있도록 한다.

#### Rendering 엔진

Flutter는 자체적인 렌더링 엔진을 포함하고 있다. 이 엔진은 Skia라는 그래픽 라이브러리를 기반으로 하며, 플랫폼 독립적인 고성능 그래픽 처리를 가능하게 한다. Flutter의 렌더링 엔진은 애플리케이션의 UI를 픽셀 단위로 직접 그리기 때문에, 각 플랫폼의 네이티브 UI 요소와는 무관하게 동일한 UI를 제공할 수 있다.

렌더링 엔진은 또한 다양한 하드웨어 가속 기능을 활용하여 애니메이션이나 화면 전환 등에서 부드러운 사용자 경험을 제공한다. 이로 인해 Flutter는 네이티브 애플리케이션과 비교해도 손색없는 성능을 제공할 수 있다.

#### Hot Reload 기능

Flutter의 개발 과정에서 매우 유용한 기능 중 하나는 **Hot Reload**이다. 이 기능은 개발자가 코드를 수정한 후 애플리케이션을 다시 빌드하지 않고도 즉시 변경 사항을 UI에서 확인할 수 있게 해준다. 이는 개발 속도를 비약적으로 향상시킬 수 있으며, 특히 UI 디자인을 반복적으로 수정하고 테스트해야 하는 경우에 매우 유용하다.

Hot Reload는 Dart VM(Virtual Machine)이 현재 상태를 유지하면서 수정된 부분만 반영할 수 있는 구조를 가지고 있기 때문에, 애플리케이션 상태를 잃지 않고 빠른 피드백을 제공할 수 있다. 이 기능은 Flutter가 개발자들 사이에서 인기를 끌게 된 중요한 요인 중 하나이다.

#### Dart 프로그래밍 언어

Flutter의 핵심 언어는 Dart이다. Dart는 구글이 개발한 객체 지향 프로그래밍 언어로, Flutter를 위해 최적화되어 있다. Dart는 JIT(Just-In-Time) 컴파일링과 AOT(Ahead-Of-Time) 컴파일링을 모두 지원하여 개발 중 빠른 피드백을 제공하면서도, 최종 빌드에서는 네이티브 성능을 제공한다.

Dart의 문법은 JavaScript와 유사하여 웹 개발자들에게 친숙하며, 정적 타입 언어로서 타입 안정성을 제공한다. 또한, Dart는 비동기 프로그래밍을 지원하는 강력한 Future 및 Stream API를 제공하여, 비동기 작업을 효율적으로 처리할 수 있도록 한다.

#### Flutter의 아키텍처

Flutter는 크게 세 가지 주요 계층으로 구성된다. 첫째, **Framework** 계층은 Flutter의 핵심 라이브러리로, 위젯, 렌더링, 애니메이션, 제스처 처리 등의 기능을 제공한다. 둘째, **Engine** 계층은 Skia 기반의 렌더링 엔진과 Dart 런타임을 포함하며, UI를 실제로 그리는 작업을 수행한다. 마지막으로, **Embedder** 계층은 각 플랫폼에 맞는 코드와 Flutter 엔진을 연결하는 역할을 하며, 네이티브와 Flutter 코드 간의 상호작용을 관리한다.

이러한 계층 구조는 Flutter가 다양한 플랫폼에서 일관된 성능을 유지할 수 있도록 하며, 플랫폼별 커스터마이징을 가능하게 한다.

***

관련 자료:

* Google Developers, Flutter 공식 문서.
* Flutter in Action by Eric Windmill
* Flutter Complete Reference by Alberto Miola
* Dart Up and Running by Kathy Walrath and Seth Ladd
