Dart 심화 문법, 함수형 프로그래밍과 Dart(7-13강)
Collection(List, Set, Map)
List
List<타입> 변수이름 = [ 요소 ];
변수이름 = [ 요소 ]; 도 가능 (타입 추론 가능)
요소에 변동이 있는 경우는 변수이름 앞에 var로 선언하고,
없는 경우는 final 이나 const로 선언 가능

index를 통해 각 요소에 접근 하고 바꿀 수 있음



Set
Set <타입> 변수이름 = { 요소 } ;
변수이름 = { 요소 } ;

List와 마찬가지로, 타입을 지정해주지 않고 var로 선언하면 오류가 나지 않긴 함(object로 추론함) 그래도 같은 타입으로 쓰는 걸 추천
순서 x 즉 index가 없다.


Map
Map<key타입, value타입> 변수이름 = {key : value};
변수이름 = {key : value};
요소에 변동이 있는 경우는 변수이름 앞에 var로 선언하고,
없는 경우는 final 이나 const로 선언 가능
var numbers = { }; <- 이거는 set이 아니고 map 빈 거.
키끼리 값끼리 타입이 같아야 함
(List, Set과 마찬가지로 var, final, const로 선언하면 object로 추론하기 때문에 오류 안 나긴 함.)
키는 중복 될 수 없지만 값은 중복 될 수 있음.



열거형
enum 열거형이름 { 요소 }
* 값 추가나 제거가 불가함.





함수
반환타입
함수이름
매개변수
실행할 코드
반환값



* 타입추론이 가능하기 때문에 반환 타입과 매개변수 타입을 생략가능하지만 권장x



제네릭(Generics)
클래스나 함수에서 데이터 타입을 일반화 하여 다양한 타입을 지원할 수 있게 하는 기능


사용하는 이유: 특정 타입에 의존하지 않고 여러 타입에 동일한 코드를 적용 가능 -> 재사용성 높음

제네릭은 타입추론이 안 되고 타입을 반드시 명시해야 한다????
객체지향 프로그래밍
함수형 프로그래밍
비동기 프로그래밍 중 함수형 프로그래밍에 대해 알아 보자.
함수의 연속(메서드 체이닝 method chaining)으로 프로그램을 구성하는 방식
.을 사용해서 여러 개의 함수를 하나로 연결


가변적인 데이터 사용을 최소화: 출력값이 항상 그 함수의 매개변수(입력값)에 의존 -> Pure fuction
즉 함수를 기준으로 함수 밖에 있는 변수를 사용하지 않음 -> 부작용이 드물다



함수형 프로그래밍에 많이 사용하는 함수?
▶형변환 함수(Type Casting Function)

int.parse에 대해 알아보자. (double.parse는 비슷하므로 내용 생략)


toList에 대해 알아보자.
특정 Collection 타입의 값을 List 타입으로 변환한 값을 반환함.

toSet에 대해 알아보자.

역시 Map에는 적용 불가.
asMap에 대해 알아보자.

그렇다면 Set은?
Set은 index가 없기 때문에 Map으로 변환 불가......이지만 방법은 있음.



▶고차 함수(Higher-order Function)
함수를 다루는 함수, Collection 타입의 데이터에 있는 요소를 처리하거나 변환할 때 씀.

map()에 대해 알아보자.
map은 Collection 타입인 데이터의 각 요소에 특정 함수를 적용한 새로운 Collection 타입의 데이터를 반환함.
(뭔말이여)
새로운 결과를 만든다? 는 개념인 듯?
반복문 비슷한 개념




특징:
원본 데이터를 직접 가공하지 않고, 특정 함수를 적용한 새로운 데이터를 반환함

where()에 대해 알아보자. (필터링 개념)
특정 조건에서 참인 요소들만 반환함.


특징:
원본 데이터를 직접 가공하지 않고, 특정 함수를 적용한 새로운 데이터를 반환함(상동)

* 참인 요소가 없으면 빈 값을 반환함.
firstWhere()에 대해 알아보자.
위에 거랑 같고, 참인 요소들 중에 첫번째 요소를 반환함.


* 참인 요소가 없으면 오류 발생
lastWhere()에 대해 알아보자.
위위에 거랑 같고, 참인 요소들 중에 마지막 요소를 반환함.
나머지는 firstwhere와 같으므로 생략한다.
reduce()에 대해 알아보자.
데이터 요소들을 하나의 값으로 결합

매개변수가 두 갠데 생긴 게 이렇다는데. 반복문인가?

맞는 듯.
특징
Collection 타입과 같은 타입으로만 반환 가능
Collection타입의 데이터에 요소가 없는 경우 오류 발생

fold()에 대해 알아보자.
reduce랑 비슷. 근데 얘는 초기값이 들어감.

얘는 주어진 초기값에다가 데이터 값이 할당 됨

특징(fold와 반대임)
Collection 타입과 다른 타입으로도 반환 가능
그렇다면 초기값 없이 다른 타입으로 반환하고 싶으면 초기값 자리에 null? 값 넣으면 되나?

Collection타입의 데이터에 요소가 없는 경우 오류 발생 x, 초기값을 반환하면 되기 때문 -> 에러가 덜 발생하겠군

any()에 대해 알아보자.
하나라도 주어진 조건을 만족하면 true를 반환함
수학이군ㅋㅋ

every()에 대해 알아보자.
모두 참일 경우에만 true를 반환함.

takeWhile()에 대해 알아보자.
데이터 요소들을 주어진 조건에 넣었을 때 참이 되는 동안은 반환하고 거짓이 되는 순간부터 무시함.
break이랑 비슷한 건가?

skipWhile()에 대해 알아보자.
참이 되는 동안은 무시하고 거짓이 되는 순간부터 반환 (위에 거랑 반대 개념)

* 뒤에 거 중에 참이 있어도 반환함
이제 배운 것들을 조합해 보자. 벌써 다 까먹은 듯



아래 예시는 where, map, reduce(물론 fold도 가능) 세 개 쓴 거임.




