-
플러터 시작하기 - 1. 다트 소개Flutter/Learn Flutter 2025. 4. 29. 00:22반응형
다트 소개
플러터를 시작하려면 플러터에 사용되는 다트 프로그래밍 언어에 대해 어느 정도 알아야 합니다. 이 페이지는 다트에 대해 소개합니다.
다트는 자바, 자바스크립트 또는 다른 C 계열 언어를 사용해본 사람이라면 친숙하게 느껴질 것입니다..
다음은 dart.dev에서 데이터를 가져오고, 반환된 JSON을 디코딩하여 콘솔에 출력하는 예제 코드입니다.
import 'dart:convert'; import 'package:http/http.dart' as http; class Package { final String name; final String latestVersion; final String? description; Package(this.name, this.latestVersion, {this.description}); @override String toString() { return 'Package{name: $name, latestVersion: $latestVersion, description: $description}'; } } void main() async { final httpPackageUrl = Uri.https('dart.dev', '/f/packages/http.json'); final httpPackageResponse = await http.get(httpPackageUrl); if (httpPackageResponse.statusCode != 200) { print('http 패키지를 가져오는 데 실패했습니다!'); return; } final json = jsonDecode(httpPackageResponse.body); final package = Package( json['name'], json['latestVersion'], description: json['description'], ); print(package); }
이 코드는 두 부분으로 구성되어 있습니다:
- Package 클래스 선언
- 비즈니스 로직 (main 함수)
Package 클래스는 다트에서 클래스를 사용할 때 자주 활용하는 기능들을 포함합니다. 이 클래스는 세 개의 멤버를 가지고 있으며, 생성자와 메서드를 정의하고 있습니다.
Dart 언어는 타입 안전(type-safe)합니다. 즉, 정적 타입 검사(static type checking)를 통해 변수의 값이 항상 변수의 정적 타입과 일치하는지 확인합니다. 클래스를 정의할 때 멤버를 String으로 명시하는 것은 필요하지만, 타입 추론(type inference) 덕분에 종종 생략할 수도 있습니다. 이 예제의 main 함수에서는 'final 변수명 = ' 형태로 변수를 선언하고 있습니다. 비록 타입을 명시하지 않았지만, 여전히 타입 안전합니다.
Dart는 또한 내장된 사운드 널 세이프티(Sound Null Safety) 기능을 가지고 있습니다. 예제에서 description 멤버는 String? 타입으로 선언되어 있으며, 끝에 붙은 ?는 해당 프로퍼티가 null이 될 수 있음을 의미합니다. 반면, 다른 두 멤버(name, latestVersion)는 null이 될 수 없으며, null을 할당하려고 하면 프로그램이 컴파일되지 않습니다. 이러한 점은 Package 클래스 생성자에서도 확인할 수 있습니다. 이 생성자는 필수 위치 인자 두 개와 선택적 명명 인자 하나를 받습니다.
그 다음은 main 함수입니다. 모든 Dart 프로그램(Flutter 앱 포함)은 main 함수로 시작합니다. 이 함수에서는 라이브러리 사용, 비동기 함수 표시, 함수 호출, if 문 제어 흐름 사용 등 여러 기본적인 Dart 언어 기능들을 보여줍니다.
초기화 코드는 어디에 작성하나요?
Flutter 앱의 기본 진입점은 lib/main.dart에 있습니다. 기본 main 메서드는 다음과 같습니다:
void main() { runApp(const MyApp()); }
runApp()을 호출하기 전에 빠른 초기화(한두 프레임 내 완료되는)를 수행할 수 있지만, 이 시점에서는 위젯 트리가 아직 생성되지 않았다는 것을 유의해야 합니다. 디스크나 네트워크로부터 데이터를 로드하는 등 시간이 오래 걸리는 초기화 작업은 메인 UI 스레드를 차단하지 않도록 구현해야 합니다.
또한 모든 Stateful 위젯에는 initState() 메서드가 있으며, 위젯이 생성되어 위젯 트리에 추가될 때 호출됩니다. 이 메서드를 오버라이드할 수 있으며, 메서드의 첫 줄에는 반드시 super.initState()를 호출해야 합니다.
참고:
앱을 핫 리로드(Hot reload)해도 initState나 main은 다시 호출되지 않습니다. 핫 리스타트(Hot restart)는 둘 다 다시 호출합니다.
목차
반응형'Flutter > Learn Flutter' 카테고리의 다른 글
플러터 시작하기 - 5. 사용자 입력 처리 (2) 2025.04.29 플러터 시작하기 - 4. 상태 관리 (0) 2025.04.29 플러터 시작하기 - 3. 레이아웃 (0) 2025.04.29 플러터 시작하기 - 2. 위젯 (0) 2025.04.29 플러터 시작하기 - 0. 개요 (0) 2025.04.29