💻 프로그래밍

Dart

Flutter 개발에 사용되는 Google의 프로그래밍 언어

📖 상세 설명

Dart는 Google이 2011년에 발표한 객체지향 프로그래밍 언어입니다. 원래 웹 개발에서 JavaScript를 대체하기 위해 만들어졌지만, 2017년 Flutter 프레임워크의 등장으로 크로스 플랫폼 모바일 앱 개발의 핵심 언어로 자리잡았습니다.

Dart는 AOT(Ahead-of-Time) 컴파일과 JIT(Just-in-Time) 컴파일을 모두 지원합니다. 개발 중에는 JIT 컴파일로 핫 리로드(Hot Reload) 기능을 통해 코드 변경을 즉시 확인할 수 있고, 배포 시에는 AOT 컴파일로 네이티브 수준의 성능을 달성합니다.

Dart의 핵심 특징은 강력한 타입 시스템, null safety, async/await 비동기 프로그래밍, 그리고 풍부한 표준 라이브러리입니다. 특히 Dart 2.12부터 도입된 sound null safety는 null 참조 오류를 컴파일 타임에 방지하여 런타임 크래시를 크게 줄여줍니다.

실무에서 Dart는 주로 Flutter와 함께 사용되어 iOS, Android, 웹, 데스크톱 앱을 단일 코드베이스로 개발합니다. BMW, Alibaba, Google Pay 등 글로벌 기업들이 Flutter/Dart로 앱을 제작하고 있으며, 2025년 현재 Flutter는 가장 인기 있는 크로스 플랫폼 프레임워크 중 하나입니다.

💻 코드 예제

// 1. 기본 문법과 null safety
void main() {
  // null safety - ? 없이 선언하면 null 불가
  String name = 'KAITRUST';
  String? nickname; // nullable 타입

  print('이름: $name');
  print('별명 길이: ${nickname?.length ?? 0}'); // null-aware 연산자
}

// 2. 클래스와 named parameters
class User {
  final String id;
  final String name;
  final int age;

  // named parameters with required
  User({
    required this.id,
    required this.name,
    this.age = 0,
  });

  // factory constructor
  factory User.fromJson(Map<String, dynamic> json) {
    return User(
      id: json['id'] as String,
      name: json['name'] as String,
      age: json['age'] as int? ?? 0,
    );
  }

  @override
  String toString() => 'User(id: $id, name: $name, age: $age)';
}

// 3. 비동기 프로그래밍 (async/await)
Future<List<User>> fetchUsers() async {
  try {
    // 네트워크 요청 시뮬레이션
    await Future.delayed(Duration(seconds: 1));

    final jsonList = [
      {'id': '1', 'name': '홍길동', 'age': 25},
      {'id': '2', 'name': '김철수', 'age': 30},
    ];

    return jsonList.map((json) => User.fromJson(json)).toList();
  } catch (e) {
    print('에러 발생: $e');
    rethrow;
  }
}

// 4. 컬렉션과 함수형 프로그래밍
void processData() {
  final numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

  final result = numbers
      .where((n) => n % 2 == 0)     // 짝수 필터링
      .map((n) => n * n)            // 제곱
      .reduce((a, b) => a + b);     // 합계

  print('짝수 제곱의 합: $result'); // 220
}

🗣️ 실무에서 이렇게 말하세요

💬 회의에서
"이번 프로젝트는 Flutter로 진행하려고 합니다. Dart의 핫 리로드 덕분에 UI 개발 속도가 빠르고, 하나의 코드베이스로 iOS와 Android 모두 지원할 수 있어서 개발 리소스를 50% 이상 절감할 수 있습니다."
💬 면접에서
"Dart의 null safety는 컴파일 타임에 null 참조 오류를 잡아줍니다. nullable 타입은 ?를 붙이고, required 키워드로 필수 파라미터를 명시합니다. 이를 통해 런타임 NullPointerException을 원천적으로 방지할 수 있습니다."
💬 코드 리뷰에서
"이 변수는 null이 될 가능성이 없으니 String? 대신 String으로 선언하세요. 불필요한 nullable 타입은 매번 null 체크를 해야 해서 코드가 복잡해집니다. late 키워드도 고려해보세요."

⚠️ 흔한 실수 & 주의사항

! 연산자 남용하지 않기

`!` 연산자로 강제 unwrap하면 null safety의 이점이 사라집니다. 가능하면 `?.`이나 `??`로 안전하게 처리하고, 정말 null이 아님이 확실할 때만 `!`를 사용하세요.

setState()에서 비동기 작업 주의

Flutter에서 `setState()` 내부에 `await`를 넣으면 위젯이 dispose된 후 상태 업데이트가 발생할 수 있습니다. `mounted` 체크를 하거나 비동기 작업 후에 `setState()`를 호출하세요.

const 생성자 활용하기

불변 객체는 `const` 생성자를 사용하면 컴파일 타임에 객체가 생성되어 메모리 효율성과 성능이 향상됩니다. Flutter 위젯에서 특히 중요합니다.

🔗 관련 용어

📚 더 배우기