Dart 심화 과정으로 가봅시다! Dart를 더 깊게 이해하고 활용할 수 있도록 객체지향 프로그래밍(OOP), 고급 컬렉션, 비동기 프로그래밍, 제네릭, 그리고 메타프로그래밍(annotations)을 다뤄보겠습니다.
목차
- 객체지향 프로그래밍 (OOP)
- 고급 컬렉션
- 비동기 프로그래밍 (Async Programming)
- 제네릭 (Generics)
- 메타프로그래밍과 어노테이션
- Extension (확장 메서드)
객체지향 프로그래밍 (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
Set
과 Map
은 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
'개발' 카테고리의 다른 글
알고리즘 정리하는 시간 (분류, 종류) (0) | 2025.04.19 |
---|---|
파이썬으로 시간복잡도를 알아보자 (0) | 2025.04.18 |
Dart Extension (확장 메서드) 정리 (0) | 2025.04.18 |
Dart 기초 문법 정리 (0) | 2025.04.18 |