플러터 앱 개발

Chapter 8. 함수형 프로그래밍 B - 형변환 함수, 고차 함수

yuna 2026. 1. 6. 18:40

오늘은 함수형 프로그래밍 두번째 시간입니다!

이제 본격적으로 함수형 프로그래밍에 대해서 배워보려고 합니다.

 

요즘 창업 준비로 정신이 없다보니, 

오히려 개발에 대해서 하나하나 배워가는 과정이 잠깐의 재미처럼 느껴집니다..

 

저...미치지 않았습니다...허허

 

암튼 오늘도 열심히 달려보시죠!!!

 


함수형 프로그래밍

함수형 프로그래밍에 많이 사용하는 함수는?

1. 형변환 함수: 특정 타입의 데이터를 다른 타입의 데이터로 변환하는 함수


 종류

  1. toString( ) : 값을 String 타입으로 변환 값을 반환
  2. int.parse(''):
    1) `String` 타입의 값을 `int` 타입으로 변환한 값을 반환
    2) `int` 타입으로 바꿔줄 문자열을 매개변수에 전달
    3) 변환이 어려운 경우에는 오류가 발생 / int.tryParse(’’)를 사용하면 오류 대신 null을 반환
  3. double.parse('')
    1) String 타입의 값을 double 타입으로 변환한 값을 반환
    2) 변환이 어려운 경우에는 오류가 발생 / double.tryParse(’’)를 사용하면 오류 대신 null을 반환
  4. toList( ): 특정 Collection 타입의 값을 List 타입으로 변환한 값을 반환 -> Map에는 적용할 수 없음
  5. toSet( ): 특정 Collection 타입의 값을 Set 타입으로 변환한 값을 반환
    * Set은 중복값을 허용하지 않기 때문에 Collection 값에 중복값이 있으면 중복값을 제외한 Set을 반환
    * Map에는 적용할 수 없음
  6. asMap( ): 특정 Collection 타입의 값을 Map 타입으로 변환한 값을 반환
    * List의 Index가 Map의 키로, List의 값이 Map의 값으로 할당
    * Set에는 적용할 수 없음 / 그러나 Set -> List로 변환 -> 다시 Map으로 변환은 가능!



2. 고차 함수: 함수를 다루는 함수
: Collection 타입의 데이터에 있는 요소를 처리하거나 변환할 때 사용

종류


1. map( ): Collection 타입인 데이터의 각 요소에 특정 함수를 적용한 새로운 Collection 타입의 데이터를 반환

 

  • 형태 1:  map(([매개변수]) { return [매개변수에 적용할 동작] });
List<String> fruitList = ['사과', '오렌지', '수박'];
var delicious = fruitList.map((fruit) {
	return '맛있는 $fruit';
});
print(delicious); // (맛있는 사과, 맛있는 오렌지, 맛있는 수박)

 

  • 형태 2: map(([매개변수]) => [매개변수에 적용할 동작] );
List<int> numbers = [1, 2, 3, 4, 5];
var doubledNumbers = numbers.map((n) => n * 2);
print(doubledNumbers); // (2, 4, 6, 8, 10)

 

-> 컬렉션에서 key랑 value값이 있는 Map이랑 다른겁니다!!!

 

특징

  • 원본 데이터를 직접 가공하지 않고, 특정 함수를 적용한 새로운 데이터를 반환
  • 원본 데이터와 크기가 같은 데이터를 반환

2. where( ): Collection 타입의 데이터에 있는 각 요소들을 특정 조건에 넣었을 때,
                     참인 요소들만 필터링한 새로운 Collection 타입의 데이터를 반환

 

  • 형태 1: where(([매개변수]) { return [조건식] });
List<int> numbers = [1, 2, 3, 4, 5, 6];
var result = numbers.where((number) {
	return number.isEven //.isEven 은 짝수
});
print(result); // (2, 4, 6)

 

  • 형태 2: where(([매개변수]) => [조건식] );
List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var result = numbers.where((n) => n > 5);
print(result); // (6, 7, 8, 9, 10)

 

특징

  • 조건식이 참인 요소가 없는 경우에는 빈 값을 반환

 

3. firstWhere( ): Collection 타입의 데이터에 있는 각 요소들을 특정 조건에 넣었을 때 참인 요소들 중 첫번째 요소를 반환

 

  • 형태 1: firstWhere(([매개변수]) { return [조건식] });
List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var result = numbers.firstWhere((number) {
	return number > 5;
});
print(result); // 6

 

  • 형태 2: firstWhere(([매개변수]) => [조건식] );
    -> 매개변수에 적용할 동작을 한줄로 표현 가능한 경우에만 사용
List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var result = numbers.firstWhere((n) => n > 5);
print(result); // 6

 

 

특징

  • 조건식이 참인 요소가 없는 경우에는 오류가 발생 💥

4. lastWhere( ): Collection 타입의 데이터에 있는 각 요소들을 특정 조건에 넣었을 때 참인 요소들 중 마지막 요소를 반환

 

  • 형태 1: lastWhere(([매개변수]) { return [조건식] });
List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var result = numbers.lastWhere((number) {
 return number > 5;
});
print(result); // 10

 

  • 형태 2: lastWhere(([매개변수]) => [조건식] );
List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var result = numbers.firstWhere((n) => n > 5);
print(result); // 6

 

특징

  • 조건식이 참인 요소가 없는 경우에는 오류가 발생 💥

5. reduce( ): Collection 타입의 데이터에 있는 요소들을 하나의 값으로 결합

 

  • 형태 1: reduce(([매개변수1], [매개변수2]) { return [적용할 동작] });
List<int> numbers = [1, 2, 3, 4];
var result = numbers.reduce((a, b) {
  return a * b;
});

 

  • 형태 2: reduce(([매개변수1], [매개변수2]) => [적용할 동작] );
List<int> numbers = [1, 2, 3, 4, 5];
var result = numbers.reduce((a, b) => a + b);

 

실행 방법
: 매개변수1 에는 이전 실행에서 반환된 값 (첫번째 실행에서는 이전 실행이 없기 때문에 Collection 타입의 데이터에 있는 첫번째 값) 이 할당되고, 매개변수2 에는 Collection 타입의 데이터에 있는 다음 값이 할당

List<int> numbers = [1, 2, 3, 4, 5];
int result = numbers.reduce((a, b) {
  print('a : $a');
  print('b : $b');
  print('a + b : ${a + b}');
  print('----------------------');
  return a + b;
});
print('result : $result');

/*
a : 1
b : 2
a + b : 3
----------------------
a : 3
b : 3
a + b : 6
----------------------
a : 6
b : 4
a + b : 10
----------------------
a : 10
b : 5
a + b : 15
----------------------
result : 15
*/

 

특징

  • Collection 타입의 데이터와 같은 타입으로만 반환
  • Collection 타입의 데이터에 요소가 없는 경우에는 오류가 발생 💥

6. fold( ): Collection 타입의 데이터에 있는 요소들을 하나의 값으로 결합

 

  • 형태 1: fold(초기값, ([매개변수1], [매개변수2]) { return [적용할 동작] });
List<int> numbers = [1, 2, 3, 4, 5];
var result = numbers.fold(0, (a, b) {
	return a + b
});

 

  • 형태 2: fold(초기값, ([매개변수1], [매개변수2]) => [적용할 동작] );
List<int> numbers = [1, 2, 3, 4, 5];
var result = numbers.fold(0, (a, b) => a + b);

 

실행 방법

: 매개변수1 에는 이전 실행에서 반환된 값 (첫번째 실행에서는 초기값) 이 할당되고, 
매개변수2 에는 Collection 타입의 데이터에 있는 다음 값이 할당

List<int> numbers = [1, 2, 3, 4, 5];
int result = numbers.fold(0, (a, b) {
  print('a : $a');
  print('b : $b');
  print('a + b : ${a + b}');
  print('----------------------');
  return a + b;
});
print('result : $result');

/*
a : 0
b : 1
a + b : 1
----------------------
a : 1
b : 2
a + b : 3
----------------------
a : 3
b : 3
a + b : 6
----------------------
a : 6
b : 4
a + b : 10
----------------------
a : 10
b : 5
a + b : 15
----------------------
result : 15
*/

 

특징

  • Collection 타입의 데이터와 다른 타입으로도 반환이 가능
  • Collection 타입의 데이터에 요소가 없어도 오류가 발생하지 않음
  • -> reduce( )와 차별점 확인!

7. any( ): Collection 타입의 데이터에 있는 요소 중 하나라도 주어진 조건을 만족하면 true 를 반환

 

  • 형태 1: any(([매개변수]) { return [조건식] });
List<int> numbers = [1, 2, 3, 4, 5];
var result = numbers.any((number) {
 return number.isEven;
});
print(result); // true

 

  • 형태 2: any(([매개변수]) => [조건식] );
List<int> numbers = [1, 2, 3, 4, 5];
var result = numbers.any((n) => n.isEven);
print(result); // true

 

 

8. every( )

: Collection 타입의 데이터에 있는 모든 요소가 주어진 조건을 만족하면 true 를 반환

 

  • 형태 1: every(([매개변수]) { return [조건식] });
  • 형태 2: every(([매개변수]) => [조건식] );

9. takeWhile( )

: Collection 타입의 데이터에 있는 요소들을 주어진 조건에 넣었을 때 참이 되는 동안은 해당 요소들을 반환하고, 조건이 처음으로 거짓이 되는 순간부터의 요소들은 모두 무시해요

 

  • 형태 1: takeWhile(([매개변수]) { return [조건식] });
  • 형태 2: takeWhile(([매개변수]) => [조건식] );

 

10. skipWhile( )

: Collection 타입의 데이터에 있는 요소들을 주어진 조건에 넣었을 때 참이 되는 동안은 해당 요소들을 건너뛰고, 조건이 처음으로 거짓이 되는 순간부터의 요소들을 모두 반환

 

  • 형태 1: skipWhile(([매개변수]) { return [조건식] });
  • 형태 2: takeWhile(([매개변수]) => [조건식] );