iBetter Books
수정

함수와 컬렉션

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로 컬렉션 리터럴을 풍부하게 표현할 수 있습니다.