본문 바로가기
Language/Dart

[Dart] 함수형 프로그래밍적인 특징

by 삼준 2023. 4. 1.
반응형

Dart는 객체지향 프로그래밍과 함수형 프로그래밍의 특징을 모두 제공함.

0. 함수형 프로그래밍의 특징

함수형 프로그래밍 : 자료처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임이자 코딩 접근 방식.

0.1. 순수 함수
동일한 입력에는 항상 같은 값을 반환해야 하며, 함수 내부에서 값이 변경되거나 프로그램 상태가 바뀌는 등 Side Effect가 없어야 함.

0.2. 비상태(Stateless), 불변성
데이터의 변경이 필요한 경우, 원본의 복사본을 만들어 작업함.

0.3. 선언형 프로그래밍
기존의 명령형 프로그래밍에 반대되는 개념으로, 명령형 프로그래밍에서는 HOW(알고리즘)를 중시했다면 선언형 프로그래밍에서는 WHAT(목표)을 중시함. 코드가 map, filter, take, reduce 등 기존에는 잘 쓰이지 않은 함수들로 높게 추상화되어 짜임.

0.4. 1급 객체(First-class Object)와 고차함수
함수형 프로그래밍에서 함수는 1급 객체가 되며 1급 객체의 특징은 다음과 같음.
- 변수나 데이터 구조 안에 담을 수 있음.
- 파라미터로 전달할 수 있음.
- 리턴값으로 사용할 수 있음.
- 할당에 사용된 이름과 관계없이 고유한 구별이 가능함.
- 동적으로 프로퍼티 할당이 가능함.
또한 고차 함수의 속성을 가져야 하는데, 고차 함수의 특징은 다음과 같음.
- 함수를 인자로써 전달할 수 있어야 함.
- 함수의 반환 값으로 또 다른 함수를 사용할 수 있음.

// 고차 함수
var addInform = (name) => (age) => age + name;
var jun = addInform("세준");

print(jun("01")); // 01세준


0.5. 함수형 프로그래밍의 장단점

장점
- 높은 수준의 추상화
- 수월한 함수 단위의 코드 재사용
- 불변성 덕분에 예측하기 쉬운 프로그램의 동작
단점
- 낮은 가독성
- 반복 대신 쓰이는 재귀로 인한 무한 루프의 가능성
- 순수 함수들의 조합이 어려움


1. Dart가 가진 함수형 프로그래밍적 특징

1.1. 1급 객체(First-class object)
Dart는 1급 객체를 지원함.
다트에서 함수를 표현할 수 있는 것들(람다식, 익명 함수, 메서드)은 모두 값으로 취급할 수 있음.
아래 나오는 함수들은 전부 인수로 함수를 받을 수 있음.

1.2. for문과 forEach() 함수
for문은 외부적으로(코드 상에서) 보이는 반복을 수행하며, forEach는 외부적으로 봤을 때는 반복문 형태를 띠지 않지만 내부적으로 반복을 함.
[ forEach.( (변수명) {내용} ) ] 의 형태로 사용됨. 인자로 받는 것은 함수임.

1.3. where
조건을 필터링할 때 사용하는 함수. 파이썬의 filter와 같음.
함수형 프로그래밍을 지원하는 함수들은 결과를 iterable 한 타입으로 반환하며 메서드 체인으로 연결하여 사용가능함. ( . 연산자로 메서드를 이어서 쓰는 것)

items.where((e) => e % 2 == 0).forEach(print);


1.4. map
반복되는 값에 대해 일정 작업을 수행하는 방법을 제공하는 함수. 파이썬의 map과 같음.

items.where((e) => e % 2 == 0).map((e) => '숫자 $e').forEach(print);


1.5. toList
Dart에서 함수형 프로그래밍을 지원하는 대부분의 함수는 Iterable 타입의 인스턴스를 반환하기 때문에 리스트 형태로 반환하기 위한 함수.

List<int> result = items.where((e) => e % 2 == 0).toList();


1.6. toSet
중복된 값을 제거하기 위해 사용하는 함수.

final items = [1, 2, 2, 3, 3, 4, 5];
List<int> result = items.where((e) => e % 2 == 0).toSet().toList();


1.7. any
리스트에 특정 조건을 충족하는 요소가 있는지 확인할 때 사용하는 함수. 파이썬의 any와 같음.

bool flag2 = items.any((e) => e % 2 == 0);


1.8. every
리스트의 모든 요소가 조건에 부합하는지 확인할 때 사용하는 함수. 파이썬의 all과 같음.

bool flag2 = items.every((e) => e < 7);


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

import 'dart:math';

void main() {
  final List<int> items = [1, 2, 3, 4, 5];

  int maxResult = items[0];
  for(int i=1; i<items.length; i++){
    maxResult = max(items[i], maxResult);
  }
  print(maxResult);  // 5
  
  print(items.reduce(max));  // 5

  int sumResult = items.reduce((value, element) => value + element);
  print(sumResult);  // 15
}




반응형

'Language > Dart' 카테고리의 다른 글

[Dart] 기본 문법 정리  (0) 2023.04.01

댓글