함수형 프로그래밍에 대해서 배워보자
첫번째 정의는 함수의 연속으로 프로그램을 구성하는 것이라고 생각하면 된다고 한다
Method Chaining이라고도 한다고 한다
- ' . ' 을사용해서 여러개의 함수를 하나로 연결하는 방식
아래 코드와 같이 여러 method 를 연속적으로 사용하는 방식
var result = number.abs().toString();
두번째 정의는 가변적인 데이터의 사용을 최소화하여 프로그램을 구성하는 방식이라고 하는데
예제로 살펴보자
아래와 같이 매개변수에만 의존하는 함수의 형태를 Pure FUnction(순수 함수)라고 한다
int add(int a, int b){
return a + b;
}
또다른 예제로는 아래와 같은 함수도 있다
잘 보면 매개변수를 의존하여 값을 계산하기 때문이다(스코프 안에서만 변경한다)
int getTotal(List<int> numbers) {
int result = 0;
for (var number in numbers){
result += numbers;
}
return result;
}
함수형 프로그래밍에서 많이 사용하는 함수에는 2가지가 있다
- 형변환 함수(Type Casting Function)
-> 특정 데이터를 다른 타입의 데이터로 변경하는 함수(toString(), int.parse('')같은 함수)
- 고차 함수(Higher-order function)
-> map(), where(), reduce(), fold(), any(), every(), takeWhile()등 여러가지 종류가 있으며 중요한 몇가지 함수를 알아보자
-> map()은 Collection타입의 데이터 각요소에 특정 함수를 적용한 새로운 collection을 반환하는 함수이다(shallow copy)
-> 예제는 아래 코드와 같다. List의 모든 요소에 특정 작업을 해서 새로운 List를 반환하고 있다.
//map(([매개변수]) { return [동작] });
List<String> fruitList = ['a', 'b', 'c'];
var delicious =. ruitList.map((fruit) {
var word = '맛있는';
word += fruit;
reutrn word;
});
print(delicious); // 맛있는 a, 맛있는 b, 맛있는 c 출력
//map(([매개변수]) => [동작]);
List<String> fruitList = ['a', 'b', 'c'];
var delicious = fruitList.map((fruit) => '맛있는 + $fruit');
print(delicious); // 맛있는 a, 맛있는 b, 맛있는 c 출력
-> where()은 Collection 요소중 참인 조건에 부합되는 요소만 필터링한 컬렉션을 반환한다
-> 예제는 아래와 같다. Return안에 bool값을 판별할 수 있는 식이 존재해야 한다
-> 자매품으로 firstWhere(), lastWhere()등이 있다만 얘네들은 참인 요소가 없을때는 에러를 뱉는다(stateError)
// where(([매개변수]) { return [조건식]; }
List<int> numbers = [1,2,3,4,5,6,7];
var result = numbers.where((number) {
return number > 5;
});
print(result); // 6,7 출력
-> reduce()는 collection에 있는 요소들을 하나의 값으로 결합하는 함수
-> 예제는 아래와 같다, 리스트를 순회하면서 앞에 값을 뒤에 값에 계속더하면서 진행된다
-> 특징은 collection의 데이터타입 과 같은 타입으로만 반환할 수 있고 데이터가 비어있을경우 에러가 발생한다(stateError)
// reduce(([매개변수1], [매개변수2]) { return [동작] };
List<int> numbers = [1,2,3,4,5];
var result = numbers.reduce((a, b) {
return a + b
});
print(result); // 15 출력
-> fold()는 reduce에서 초기값이 추가된다. reduce()와는 다르게 초기값이 초기값으로 세팅된다.
-> 특이사항으로는 다른 타입으로도 반환이 가능하고 요소가 없어도 에러가 발생 안한다고 한다.
// fold(초기값, ([매개변수1], [매개변수2]) { return [동작] });
// 앞에 초기값이 추가된다
List<int> numbers = [1,2,3,4,5];
var result = numbers.fold(0, (a, b) {
return a + b
});
print(result); // 15 출력
-> any()는 주어진 collection중 하나라도 조건을 만족시 true를 반환한다(where과 비슷하지만 bool을 반환한다)
-> every()는 collection에서 모든 요소가 맞아야 true가 반환된다
-> takeWhile()은 collection에서 true인 요소가 나오는 동안에는 요소를 반환하고 false로 나오는 요소부터는 무시하는 기능이다
-> skipWhile()은 collection에서 true인 요소가 나오는 동안에는 요소를 스킵하고 false로 나오는 순간부터의 요소를 모두 반환한다
Method Chaining은 위 고차함수를 잘 조합해서 쓰는게 핵심이다
map() + where(),
where() + reduce(),
where() + map() + fold() 등등
Chaining을 통해 collection에서 필요한 여러 작업을 짧은 코드수로 끝낼 수 있다