ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 플러터 시작하기 - 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)는 둘 다 다시 호출합니다.

    목차

    플러터 시작하기 - 0. 개요

    플러터 시작하기 - 1. 다트 소개

    플러터 시작하기 - 2. 위젯

    플러터 시작하기 - 3. 레이아웃

    플러터 시작하기 - 4. 상태 관리

    플러터 시작하기 - 5. 사용자 입력 처리

    플러터 시작하기 - 6. 네트워킹과 데이터

    플러터 시작하기 - 7. 로컬 캐싱

    반응형
Designed by Tistory.