함수형 프로그래밍

luneah·2022년 7월 22일
0

Flutter

목록 보기
15/29
post-thumbnail

함수형 프로그래밍

다트는 객체지향 프로그래밍과 함수형 프로그래밍 특징을 모두 제공한다. 함수형 프로그래밍은 자료 처리를 수학적 함수의 계산으로 취급하는 프로그래밍 패러다임이다.

일급 객체 (first class object)

다트에서는 함수를 값으로 취급할 수 있다. 그러므로 변수에 함수를 대입할 수 있다.

void greeting(String text) {
  print(text);
}

void main() {
  var f = greeting;  // 함수를 다른 변수에 대입할 수 있음
  f('hello');
}

다른 함수의 매개변수로 함수 자체를 전달하거나 반환받을 수도 있다.

void something(Function(int i) f) {
  f(10);
}

void main() {
  something((value) {
    print(value);
  });
}

for문과 forEach() 함수

위 for문은 아래 forEach로 동일하게 작성할 수 있다.

final items = [1, 2, 3, 4, 5];

for (var i = 0; i < items.length; i++) {
  print(items[i]);  // 1, 2, 3, 4, 5
}

세 가지 방법 모두 동일한 결과 나타낸다.

items.forEach(print);  // 1, 2, 3, 4, 5

items.forEach((e) {
  print(e);
});

items.forEach((e) => print(e));

where 함수

두 가지 방법 모두 동일한 결과를 나타낸다.

final items = [1, 2, 3, 4, 5];

for (var i = 0; i < items.length; i++) {
  if (items[i] % 2 == 0) {
    print(items[i]);  // 2, 4
  }
}
items.where((e) => e % 2 == 0).forEach(print);  // 2, 4

map 함수

두 가지 방법 모두 동일한 결과를 나타낸다.

final items = [1, 2, 3, 4, 5];

for (var i = 0; i < items.length; i++) {
  if (items[i] % 2 == 0) {
    print('숫자 ${items[i]}');  // 숫자 2, 숫자 4
  }
}
items.where((e) => e % 2 == 0).map((e) => '숫자 $e').forEach(print);

toList()

다트에서 함수형 프로그래밍을 지원하는 함수 대부분은 Iterable<T>라는 타입을 반환한다. 실제로 활용시에는 List형태로 변환하여 사용하는 일이 많다.

final result = [];
items.forEach((e) {
  if (e % 2 == 0) {
  	result.add(e);
  }
});
final result = items.where((e) => e % 2 == 0).toList();

toSet()

자료구조 Set으로 변환하는 함수. 중복을 허용하지 않기 때문에 간단히 중복데이터를 제거할 수 있다.

final items = [1, 2, 2, 3, 3, 4, 5];
  
var result = [];
var temp = <int>{};
for (var i = 0; i < items.length; i++) {
  if (items[i] % 2 == 0) {
    temp.add(items[i]);
  }
}
result = temp.toSet();
print(result);  // 2, 4
final result = items.where((e) => e % 2 == 0).toSet().toList();  // 2, 4

any

특정 조건을 충족하는 요소가 있는지를 검사할 때 사용한다.

final items = [1, 2, 2, 3, 3, 4, 5];

var result = false;
for (var i = 0; i < items.length; i++) {
  if (items[i] % 2 == 0) {
    result = true;
    break;
  }
}
print(result);  // true
print(items.any((e) => e % 2 == 0));  // true

reduce

반복 요소를 줄여가면서 결과를 만들 때 사용하는 함수이다.

import 'dart:math';

final items = [1, 2, 3, 4, 5];

var maxResult = items[0];
for (var i = 1; i < items.length; i++) {
  maxResult = max(items[i], maxResult);
}
print(maxResult);  // 5
final items = [1, 2, 3, 4, 5];
print(items.reduce((e, v) => max(e, v))); // 5

final result = items.reduce(max);  // 5

함수형 프로그래밍 퀴즈

profile
하늘이의 개발 일기

0개의 댓글