함수와 컬렉션
Dart의 함수는 일급 객체입니다. 변수에 담고, 다른 함수에 전달하고, 반환할 수 있습니다. 컬렉션 API는 함수형 스타일 체이닝을 강력하게 지원합니다. 실무에서 자주 쓰는 패턴을 중심으로 빠르게 복습합니다.
함수 기본
// 기본 함수
int add(int a, int b) {
return a + b;
}
// 화살표 함수 (단일 표현식)
int multiply(int a, int b) => a * b;
// void 함수
void printGreeting(String name) => print('Hello, $name!');
// 함수를 변수에 저장
final fn = add;
print(fn(1, 2)); // 3
// 익명 함수 (람다)
final square = (int x) => x * x;
매개변수 종류
위치 매개변수 (기본)
String greet(String name, int age) {
return '$name is $age years old.';
}
greet('Alice', 30);
선택적 위치 매개변수
// [] 안의 매개변수는 선택적
String greet(String name, [String? title]) {
if (title != null) return '$title $name';
return name;
}
greet('Alice'); // Alice
greet('Alice', 'Dr.'); // Dr. Alice
명명된 매개변수
// {} 안의 매개변수는 이름으로 전달
void createUser({
required String name, // required: 반드시 전달
int age = 0, // 기본값 지정 가능
String? email, // nullable이면 선택적
}) {
print('$name, $age, $email');
}
createUser(name: 'Alice', age: 30, email: '[email protected]');
createUser(name: 'Bob'); // age=0, email=null
고차 함수
함수를 매개변수로 받거나 반환하는 함수입니다.
// 함수를 매개변수로 받기
List<int> transform(List<int> list, int Function(int) fn) {
return list.map(fn).toList();
}
final doubled = transform([1, 2, 3], (x) => x * 2);
// [2, 4, 6]
// 함수를 반환하기
String Function(String) makeGreeter(String prefix) {
return (name) => '$prefix, $name!';
}
final hello = makeGreeter('Hello');
print(hello('Dart')); // Hello, Dart!
List
// 생성
final nums = [1, 2, 3, 4, 5];
final empty = <String>[];
final filled = List.filled(3, 0); // [0, 0, 0]
final generated = List.generate(5, (i) => i * 2); // [0, 2, 4, 6, 8]
// 기본 조작
nums.add(6);
nums.addAll([7, 8]);
nums.remove(1);
nums.removeAt(0);
nums.insert(0, 99);
// 접근
final first = nums.first;
final last = nums.last;
final slice = nums.sublist(1, 3); // 인덱스 1~2
// 검색
final has3 = nums.contains(3);
final idx = nums.indexOf(4);
함수형 메서드
final numbers = [1, 2, 3, 4, 5, 6];
// map: 변환
final squares = numbers.map((n) => n * n).toList();
// [1, 4, 9, 16, 25, 36]
// where: 필터
final evens = numbers.where((n) => n.isEven).toList();
// [2, 4, 6]
// reduce: 누적
final sum = numbers.reduce((a, b) => a + b);
// 21
// fold: 초기값 있는 누적
final product = numbers.fold(1, (acc, n) => acc * n);
// 720
// any / every
final hasNegative = numbers.any((n) => n < 0); // false
final allPositive = numbers.every((n) => n > 0); // true
// expand: 중첩 리스트 평탄화
final nested = [[1, 2], [3, 4], [5]];
final flat = nested.expand((e) => e).toList();
// [1, 2, 3, 4, 5]
// 체이닝
final result = numbers
.where((n) => n.isOdd)
.map((n) => n * 10)
.toList();
// [10, 30, 50]
Set
중복 없는 컬렉션입니다.
final set1 = {1, 2, 3, 4};
final set2 = {3, 4, 5, 6};
set1.add(5);
set1.remove(1);
// 집합 연산
final union = set1.union(set2); // 합집합
final intersection = set1.intersection(set2); // 교집합
final difference = set1.difference(set2); // 차집합
// 중복 제거에 활용
final withDuplicates = [1, 2, 2, 3, 3, 4];
final unique = withDuplicates.toSet().toList();
// [1, 2, 3, 4]
Map
키-값 쌍의 컬렉션입니다.
// 생성
final user = {
'name': 'Alice',
'age': 30,
'email': '[email protected]',
};
// 접근
final name = user['name']; // 'Alice' (String?)
final role = user['role'] ?? 'user'; // 없으면 기본값
// 수정
user['age'] = 31;
user['phone'] = '010-1234-5678';
user.remove('email');
// 순회
user.forEach((key, value) {
print('$key: $value');
});
// 변환
final keys = user.keys.toList();
final values = user.values.toList();
final entries = user.entries.map((e) => '${e.key}=${e.value}');
// 맵 변환
final uppercased = user.map(
(key, value) => MapEntry(key.toUpperCase(), value),
);
스프레드 연산자와 컬렉션 if/for
Dart의 강력한 컬렉션 리터럴 기능입니다.
final base = [1, 2, 3];
final extra = [4, 5];
// 스프레드
final combined = [...base, ...extra]; // [1, 2, 3, 4, 5]
// null-aware 스프레드
List<int>? maybeNull;
final safe = [...base, ...?maybeNull]; // [1, 2, 3]
// 컬렉션 if
final isAdmin = true;
final menu = [
'Home',
'Profile',
if (isAdmin) 'Admin Panel', // 조건부 포함
];
// 컬렉션 for
final items = ['apple', 'banana', 'cherry'];
final tags = [
for (final item in items) '#$item',
];
// ['#apple', '#banana', '#cherry']
정리
핵심 요점만 정리합니다.
- 명명된 매개변수에서
required는 null safety와 함께 필수 파라미터를 보장합니다. map,where,reduce,fold를 체이닝하면 선언적이고 읽기 쉬운 코드가 됩니다.Set은 중복 제거,Map은 키-값 저장에 사용합니다.- 스프레드 연산자와 컬렉션 if/for로 컬렉션 리터럴을 풍부하게 표현할 수 있습니다.