본문 바로가기

Programming/Kotlin

12장. 함수형 프로그래밍과 람다

12.1 함수형 프로그래밍이란?

 12.1.1 함수형 프로그래밍 정의

   - 프로그래밍 패러다임으로서의 함수형 프로그래밍 : 함수 선언이 최우선. 데이터의 흐름이 아니라 함수의 선언과

     선언된 함수의 유기적인 흐름이 주 목적이다.

   - 데이터의 흐름과 값의 변경에 따라 프로그래밍하지 말고 필요한 로직을 함수로 만들어서 함수들의 흐름에 따라

     프로그래밍하자는 개념이다.

   - 주요 원칙 : 일급 객체(First Class Citizen)로서의 함수, 순수 함수(Pure Function)로 정의되는 함수

 

   - 일급 객체 : 함수가 프로그램의 최상위 구성요소이다. 객체지향에서는 클래스가 최상위 단위이고 함수를 포함하는

     개념이다. 즉 클래스를 선언하지 않고도 함수를 정의할 수 있고, 함수내 다른 함수, 클래스를 포함할 수 있다. 또한

     함수를 변수처럼 사용할 수 있다.(함수의 인수로 전달 가능, 함수를 반환 가능)

 

   - 순수 함수 : Side Effect(부수효과)가 발생하지 않는 함수이다. 즉 같은 인수를 전달해서 함수를 호출하면 항상 같은

     값을 반환한다. 함수내에서 함수 밖의 데이터를 변경하는 작업 X, 별도의 입출력 X

 

   - 함수형 프로그래밍에서의 데이터

     - 데이터는 변경되지 않으며 프로그램의 상태만 표현한다.(데이터 불변성)

     - 함수에서 데이터는 변경하지 않고 새로운 데이터를 만들어 반환한다.

     - 정리하면 함수형 프로그래밍에서는 아예 변수가 없다. 변경할 수 없는 상수 데이터만 이용하고 함수의 흐름에

       따라 프로그래밍하자는 개념이다.

 

   - 함수형 프로그래밍의 이점

     - 코드가 간결하여 개발 생산성과 유지 보수성이 증대된다.

     - 동시성 작업을 좀 더 쉽고 안전하게 구현할 수 있다.

     - 멀티코어 프로세싱에서 함수형 프로그래밍은 순수 함수를 이용하고 부수효과가 발생하지 않으므로 스레드

       안전성을 확보할 수 있고 병렬 처리에 도움을 준다.

 

 12.1.2 함수형 프로그래밍의 원칙

   - 일급 객체 : 함수가 최상위 레벨에 선언되어 다른 구성 요소(변수, 함수, 클래스)를 가질 수 있어야하고, 변수처럼

     이용 가능해야한다.

   - 순수 함수 : 매개 변수와 반환 값을 가지는 함수로 같은 인수를 전달하여 함수를 호출하면 항상 같은 결과 값이

     나와야 하며 함수 내에서 부수효과가 발생하지 않아야 한다.

 

 12.1.3 코틀린에서 일급 객체로서의 함수

   - 코틀린에서 함수를 변수에 대입하려면 람다 함수를 이용하거나 함수 참조(Function Reference::)를 이용해야 한다.

 

12.2 람다 표현식

 12.2.1 람다 표현식이란?

   - 익명 함수를 지칭하는 용어이다. 코드의 간결함을 주목적으로 자주 이용한다.

   - 람다 함수 선언 : { 매개변수 -> 함수내용 }

   - 매개변수 타입을 선언해야 하며 추론할 수 있을 때는 생략할 수 있다.

   - 함수의 반환값은 함수 내용의 마지막 표현식이다.

 

 12.2.2 함수 타입

   - 람다 함수를 이용할 때 함수 타입을 선언하고 그 타입에 맞는 람다 함수를 정의하여 대입해 이용할 수 있다.

     ex) val lambdaFun : (Int) -> Int = { x : Int -> x * 10 }

   - typealias를 이용한 타입 정의

   - 함수 타입을 선언한 곳에 대입하는 람다 함수에서는 매개변수 타입 추론이 가능하기 때문에 매개변수 타입 생략 가능

 

 12.2.3 it을 이용한 매개변수 이용

   - 람다를 정의할 때 매개변수가 하나일 때는 별도의 매개변수를 선언하지 않고 함수에서 it으로 매개변수를 지칭할 수

     있다. 하지만 함수 타입이 정의되어 있는 곳에서만 사용이 되어야 한다.

 

 12.2.4 멤버 참조 이용

'Programming > Kotlin' 카테고리의 다른 글

안드로이드 스튜디오 recyclerView 버전 문제  (0) 2020.01.29
11장. 다양한 코틀린 클래스  (0) 2020.01.23
10장. 추상 클래스와 인터페이스  (0) 2020.01.21
9장. 상속  (0) 2020.01.20
8. 프로퍼티  (0) 2020.01.17