본문 바로가기
개발

Dart 심화 문법

by 오늘도멋진하루 2025. 4. 18.

 

 

 

Dart 심화 문법

 

Dart 심화 과정으로 가봅시다! Dart를 더 깊게 이해하고 활용할 수 있도록 객체지향 프로그래밍(OOP), 고급 컬렉션, 비동기 프로그래밍, 제네릭, 그리고 메타프로그래밍(annotations)을 다뤄보겠습니다.


목차


객체지향 프로그래밍 (OOP)

Dart는 완전히 객체지향적이기 때문에 클래스와 관련 기능이 강력합니다.

상속

class Animal {
  void sound() {
    print('동물이 소리를 냅니다.');
  }
}

class Dog extends Animal {
  @override
  void sound() {
    print('멍멍!');
  }
}

void main() {
  var dog = Dog();
  dog.sound(); // 출력: 멍멍!
}
  • extends: 상속을 선언합니다.
  • @override: 메서드를 재정의합니다.

 

추상 클래스

추상 클래스는 인스턴스화할 수 없으며, 메서드 정의만 포함할 수 있습니다.

abstract class Vehicle {
  void move(); // 추상 메서드
}

class Car extends Vehicle {
  @override
  void move() {
    print('자동차가 움직입니다.');
  }
}

void main() {
  var car = Car();
  car.move(); // 출력: 자동차가 움직입니다.
}

 

 

Mixin

Mixin은 다중 상속 대신 사용할 수 있는 방식입니다. 여러 클래스에서 재사용 가능하도록 코드를 구성할 수 있습니다.

mixin Flyable {
  void fly() {
    print('날아갑니다.');
  }
}

class Bird with Flyable {}

void main() {
  var bird = Bird();
  bird.fly(); // 출력: 날아갑니다.
}

 

 

 

 

고급 컬렉션

Dart의 컬렉션(List, Set, Map 등)은 강력한 기능을 제공합니다.

 

컬렉션 if와 for

컬렉션 내부에서 조건문과 반복문을 사용할 수 있습니다.

void main() {
  var list = [1, 2, 3, if (true) 4];
  print(list); // 출력: [1, 2, 3, 4]

  var repeatedList = [for (var i = 0; i < 3; i++) i * 2];
  print(repeatedList); // 출력: [0, 2, 4]
}

 

 

Set과 Map

SetMap은 Dart의 주요 컬렉션 타입 중 하나입니다.

void main() {
  // Set: 중복 없는 컬렉션
  var numbers = <int>{1, 2, 3, 3};
  print(numbers); // 출력: {1, 2, 3}

  // Map: 키-값 쌍
  var user = {
    'name': 'Alice',
    'age': 25,
  };
  print(user['name']); // 출력: Alice
}

 

 

비동기 프로그래밍 (Async Programming)

Future

Dart에서 비동기 처리를 위해 Future를 사용합니다.

Future<String> fetchData() async {
  await Future.delayed(Duration(seconds: 2));
  return '데이터가 로드되었습니다.';
}

void main() async {
  print('시작');
  var result = await fetchData();
  print(result); // 출력: 데이터가 로드되었습니다.
  print('끝');
}
  • async/await: 비동기 코드 작성.
  • Future: 미래의 결과를 나타냄.

 

Stream

Stream은 여러 데이터의 비동기 스트림을 처리하는 데 사용됩니다.

Stream<int> numberStream() async* {
  for (var i = 1; i <= 3; i++) {
    await Future.delayed(Duration(seconds: 1));
    yield i; // 데이터 방출
  }
}

void main() async {
  await for (var num in numberStream()) {
    print(num); // 출력: 1, 2, 3 (1초 간격)
  }
}

 

 

 

 

제네릭 (Generics)

제네릭은 코드의 재사용성과 타입 안전성을 높여줍니다.

class Box<T> {
  T content;

  Box(this.content);

  void displayContent() {
    print('내용물: $content');
  }
}

void main() {
  var intBox = Box<int>(123);
  intBox.displayContent(); // 출력: 내용물: 123

  var stringBox = Box<String>('안녕하세요');
  stringBox.displayContent(); // 출력: 내용물: 안녕하세요
}

 

메타프로그래밍과 어노테이션

Dart의 어노테이션을 활용해 코드를 확장하고 유연하게 작성할 수 있습니다.

Custom Annotation

class Deprecated {
  final String message;

  const Deprecated(this.message);
}

@Deprecated('이 메서드는 사용하지 마세요.')
void oldMethod() {
  print('이 메서드는 더 이상 사용되지 않습니다.');
}

void main() {
  oldMethod(); // 경고: 이 메서드는 사용하지 마세요.
}

 

Extension (확장 메서드)

클래스에 새로운 메서드를 추가할 수 있습니다.

extension StringExtension on String {
  String get reverse => split('').reversed.join();
}

void main() {
  var word = 'Dart';
  print(word.reverse); // 출력: traD
}

 

Dart의 심화 개념을 공부하면서 Flutter 개발에 활용하거나, 실제 프로젝트를 만들어보는 것이 실력을 키우는 가장 좋은 방법입니다.

 

확장 메서드에 대한 내용은 아래에서 더 자세히 학습할 수 있습니다.

 

Dart Extension (확장 메서드) 정리

Dart의 Extension(확장 메서드)는 기존 클래스의 기능을 확장하여 새로운 메서드나 속성을 추가할 수 있도록 합니다.이것은 원래 클래스를 수정하거나 상속받지 않고도, 기존 클래스에 새로운 기능

life.dewy-morning.com