개발자 끄적끄적

코틀린FP 본문

안드로이드 프로그래밍

코틀린FP

햏치 2023. 3. 23. 10:39

<Functional Programming(FP)>
- 함수형 프로그래밍이란
  - 자료 처리를 수학적 함수의 계산으로 다루고
  - 상대 변경(Changing state)과 가변 데이터(Mutable data)를 쓰지 않는 프로그래밍 패러다임

- 명령형 프로그래밍(Imperative programming)에서는 상태를 바꾸는 것을 강조하는 것과 달리
  함수형 프로그래밍은 함수의 응용을 강조

- 1930년대에 계산가능성, 결정문제, 함수정의, 함수응용과 재귀를 연구하기 위해 개발된 형식체계인
  람다 대수(Lambda-calculus)에 근간을 두고 있다

- 수학적 함수와 명령형 프로그래밍에서 사용되는 함수
  - 명령형 프로그래밍의 함수
    - 프로그램의 상태 값을 바꿀 수 있는 부수 효과가 생길 수 있다
    - 참조 투명성이 없고, 같은 코드라도 실행되는 프로그램의 상태에 따라 다른 결과값이 나온다
 
- 함수형 프로그래밍의 함수(수학적 함수)
  - 함수의 출력 값은 함수에 입력된 인수에만 의존
  - 인수 x에 같은 값을 넣고 함수 f를 호출하면 항상 f(x)라는 결과가 나온다(참조 투명성) 
  - 부수 효과를 제거하면 프로그램 동작 이해와 예측이 쉽다

- 함수형 프로그래밍 기본 요소
  - pure function
    - 부수 효과(side-effect)가 없는 함수
    - thread-safe하여 병렬 계산 용이
  - annoymous function : 익명함수
    - 코틀린에서는 {x->x*x}
  - higher-order function : 고차(고계) 함수, 함수를 인자나 리턴으로 다루는 함수
    - 코틀린에서는 (1..10).map {it*it}
  *코틀린은 순수한 함수형 언어가 아니다
    함수형 언어의 요소 뿐 아니라 명령형 언어, 객체 지향 언어 패러다임을 모두 가지고 있다



<Lambda>
- 어원 : 람다함수
- 이름이 없는 함수
- 형식 : { 파라미터 -> 함수 바디 }
  - {x : Int, y: Int -> x+y }
  - 함수 바디에서 마지막 수식(expression)이 리턴 값이 된다

- Lambda에서 로컬 변수 참조
  - val, var 구분 없이 모든 로컬 변수 참조가 가능하다



<Collection filter, map, group By와 lambda>
- 함수형 프로그래밍에서 Collection을 다루는 방법
- lambda가 편리하게 사용된다
- filter, map
- filter : 특정 조건을 만족하는 원소만 포함하는 Collection을 생성/리턴
  - filter에 주어진 람다를 모든 원소에 수행하여 true를 리턴하는 경우만 모은다
  - filter에 넘겨주는 람다는 Boolean을 결과로 하는 수식이어야 한다

- map : 모든 원소에 대해 특정 연산을 수행한 결과를 모아서 Collection을 생성/리턴
  - map에 주어진 람다를 모든 원소에 대해 수행하고 그 결과를 모은다

- group by : 주어진 조건에 따라 Collection을 그룹으로 나눈 후 map을 생성/리턴

- 참고 : Collection은 언어 문법이 아니고 표준 라이브러리이다



<Collection all, any, count, find와 lambda>
- all, any, count, find
- all : 모든 원소가 특정 조건을 만족하면 true, 그렇지 않으면 false
- any : 한 원소라도 특정 조건을 만족하면 true, 그렇지 않으면 false
- count : 특정 조건을 만족하는 원소의 갯수를 리턴
- find : 특정 조건을 만족하는 가장 처음 원소를 리턴


<Collection flatMap과 lambda>
- 중첩된 Collection을 하나의 리스트로 생성/리턴
- flatMap에 주어진 람다는 Iterable 객체를 리턴
  - 이 Iterable을 모두 연결하여 하나의 List로 만든다



<Collection asSequence>
- filter, map 등의 함수를 부를 때, 바로 다른 리스트를 생성하게 된다
- 이런 함수를 매우 큰 데이터에 대해 여러 번 이어서 사용하면 매우 느려진다

- 이런 경우 Sequence를 사용하면
  - 리스트 생성을 최대한 늦추게 하는 방법
  - 실제 리스트 생성을 최대한 늦추기 때문에 lazy 연산이라고 보통 부른다

- Sequence를 사용하여 연산을 끝낸 후에 다시 toList()로 Colleciton을 바꾸어서 사용한다



<lambda와 SAM>
- SAM(Single Abstract Method) : 인터페이스가 하나의 메소드만 가진 경우 
  - View.OnClickListener, Runnable 등 많은 인터페이스가 하나의 메소드만 가진다
- 코틀린에서 이런 SAM인 경우 무명 클래스 인스턴스를 만드는 것이 아니라 lambda로 처리할 수 있다




<Scope 함수>
- 객체의 이름을 반복하지 않고 그 객체에 대해 여러 연산을 수행할 수 있다
- 종류 : let, run, with, apply, also
- 함수 인자로 lambda를 전달하는데 이 lambda 내에서 객체를 it으로 또는 this로 치징
- 함수의 리턴 값은 객체 자체 또는 lambda의 결과
- 참고 : Scope 함수는 언어 문법이 아니고 표준 라이브러리이다


<Collection 연산자 오버로딩>
- []
  - get(idx), set(idx, value)

- in
  - contrains(value)

- iterator
  - iterator Implementation
  - iterator method


<가변 인자>
- vararg를 매개 변수 이름 앞에 사용
- spread 연산자 : *를 배열 앞에 붙여서 가변 인자로 넘겨줄 수 있다


<Infix Function>
- 함수 이름을 인자 중간에 넣어서 호출
- ex) mapOf(1 to "one", 2 to "two")에서 to와 같은 함수

ex) //Any를 확장(extension)하여 infix to를 정의한 것
  infix fun Any.to(other : Any) = Pari(this, other)


<Destructuring declaration>
- 값 2개를 리턴 받아 2개의 변수에 대입

'안드로이드 프로그래밍' 카테고리의 다른 글

안드로이드 레이아웃(LayOut)  (0) 2023.03.30
코틀린OPP  (0) 2023.03.18
코틀린(Kotlin) 기초  (0) 2023.03.11