CODING/강의노트-부스트코스-코틀린

[부스트코스]📱코틀린 3-3 함수형 프로그래밍 패러다임! (1)

codingTrip 2021. 2. 27. 23:35

안녕하세요? codingTrip입니다.

오늘은 "코틀린 프로그래밍  1/2(함수편)"

2단원 함수형 프로그래밍이란?

3장. 마법의 요술상자, 함수의 기본

3-3 함수형 프로그래밍 패러다임! (1)

시작하겠습니다!

 

👓 함수형 프로그래밍

코틀린은 다중 패러다임 언어

함수형 프로그래밍(FP:Functional Programming)
객체 지향 프로그래밍(OOP:Object-Oriented Promgramming)

코틀린다중(멀티) 패러다임 언어이기 때문에 함수형과 객체 지향 프로그래밍을 같이 지원하고 있습니다.

객체 지향 프로그래밍을 사용하는 자바는 객체 지향을 기반으로 해서 함수형 프로그래밍 기법에 미약합니다.

 

함수형 프로그래밍

- 코드 간략, 테스트나 재사용성 증가
- 람다식, 고차 함수를 사용해 구성
- 순수 함수

함수형 프로그래밍은 함수 자체를 가지고 여러 가지 기법을 구현한 것입니다.

함수는 특정 입력이 있고, 해당 되는 처리 후 결과를 내보냅니다.

기본적으로 InputOuput처리 내용 루틴이 있겠죠.

그래서 함수를 쓰게 되면, 코드를 간략화 할 수 있습니다.

그리고 함수 단위로 테스트 할 수 있기 때문에 테스트가 용이하고,

함수별로 해당 코드를 사용하면서 재사용성이 증가하는 이점이 있습니다.

 

중요한 점, 대표적인 특징람다식과 고차함수를 사용할 수 있다는 점입니다.

Input기본 데이터가 아닌 함수 자체도 집어 넣을 수 있다는 뜻입니다.

Ouput도 마찬가지로 일반 데이터형도 가능하지만 함수 자체를 반환할 수 있습니다.

그래서 그런 것들을 구현하기 위해 람다식과 고차함수를 사용합니다.

그 다음에 함수를 인수로서 사용하려면 최대한 함수의 순수 함수를 제공해야 합니다.

이것이 무엇인지는 이제부터 알아보겠습니다.

 

🔑 순수함수

순수 함수(pure function) 이해

- 부작용(side-effect)이 없는 함수
  - 동일한 입력 인자에 대해서는 항상 같은 결과를 출력 혹은 반환 한다.
  - 값이 예측이 가능해 결정적(deterministic)이다.

일단 순수 함수의 조건부작용이 없는 함수입니다.

입력이 항상 똑같으면 출력도 항상 똑같다는 것입니다.

부작용이 있다는 것은 반대로 동일한 입력인데 출력이 바뀔 수 있다는 뜻이겠죠?

값이 항상 예측가능해야 합니다. 그래서 결정적이라고도 할 수 있습니다.

 

 

[출처] 부스트코스 코틀린 강의자료

위의 함수에서 우리가 입력하는 ab는 항상 정수형으로 받아들이고,

항상 더해져서 똑같은 값을 내보내는 것입니다.

예를 들어, 12라는 인자를 사용했을 때에는 3이라는 값이

100만번 수행해도 동일하게 나오는 것순수함수라고 할 수 있습니다.

하지만, 우리가 12를 넣는데 100만 번 중 1번이라도 2가 나온다면

순수 함수가 아니겠죠.

 

-순수 함수의 조건
  - 같은 인자에 대하여 항상 같은 값을 반환
  - 함수 외부의 어떤 상태도 바꾸지 않는다.

위의 함수를 계속 보면서 설명하겠습니다.

만약 이 안의 처리 루틴에 외부의 c라는 변수가 있다고 합시다.

var c로 만들어 놓고 그 외부의 변수 c라는 값을 넣게 되면

변하는 c의 값에 따라 결과값이 달라지므로 순수함수가 아닙니다.

 

순수함수를 사용하는 이유는

바로 함수와 함수를 서로 전달하기 위해서 필요한 개념입니다.

나중에 배울 람다식에 사용하기 위해서 순수함수가 필요합니다.

 

) 그렇다면 순수 함수가 아닌 것은?

 

[출처] 부스트코스 코틀린 강의자료

위 check()함수처럼 어떤 함수를 설계했는데 입력이 없습니다.

함수를 실행할 때 매번 결과가 달라집니다.

check() 함수에 없는 외부 User 객체를 가져와서 사용합니다.

User의 상태에 따라서 달라질 수 있는 거죠.

if(test!=null) 이걸 조사해 봤더니 비어있지 않으면

process(test)를 이제 처리할 건데

만일 grade를 가져왔는데 비어있으면 처리가 안되겠죠?

그래서 grade 값에 따라서 결과가 달라집니다.

 

[출처] 부스트코스 코틀린 강의자료

noPureFunction함수ab라는 입력이 있습니다.

하지만 return a+b+global

ab에 여기에는 존재하지 않는 외부의 값 global을 사용합니다.

아무리 ab의 값이 동일하다고 해도,

외부값 global의 값이 변한다면 결과가 변하겠죠?

그래서 이런 것은 순수 함수가 아닙니다.

 

순수 함수를 왜?

- 입력과 내용을 분리하고 모듈화 하므로 재사용성이 높아진다.
  - 여러 가지 함수들과 조합해도 부작용이 없다.
- 특정 상태에 영향을 주지 않으므로 병행 작업시 안전하다.
- 함수의 값을 추적하고 예측 할 수 있기 때문에 테스트, 디버깅 등이 유리하다.

순수함수를 사용하면

입력과 내용을 분리한 다음에 여러분이 프로그램을 모듈화할 수 있습니다.

모듈화한 다음에 그에 해당되는 함수를 사용해서 재사용성이 높아집니다.

어떤 함수들과 조합해도 예측가능하기 때문에 부작용이 없습니다.

함수형 프로그래밍에서는 여러 함수를 조합해서 사용하는 프로그래밍이기 때문에

우리는 순수함수를 써야 합니다.

 

특정 상태에 영향을 주지 않기 때문에 병행 작업을 해도 됩니다.

즉, 어떤 특정 함수에 들어가서 동작 하고 있을 때

또 다른 어떤 루틴이 그 함수에 또 들어가도 됩니다.

함수의 값을 추적하고 예측 할 수 있기 때문에 당연히 테스트, 디버깅 등이 유리합니다.

 

함수형 프로그래밍에 적용

- 함수를 매개변수, 인자에 혹은 반환값이 적용(고차 함수)
- 함수를 변수나 데이터 구조에 저장
- 유연성 증가

함수 자체를 매개변수에 쓰는 것입니다.

함수를 설계할 때, 매개변수를 사용했습니다.

하지만 기본 데이터가 아닌 함수 자체를 넣어버리자는 거죠.

물론 인자반환값에도 사용할 수 있습니다.

함수를 선언할 때 쓰는 것은 매개변수, 사용할 때 쓰면 인자라고 부릅니다.

이런 형태의 함수를 고차 함수라고 하는데, 이것은 나중에 알아보겠습니다.

 

함수변수나 데이터 구조에 저장할 수 있습니다.

ex) val abc = 특정 함수 만들어서 넣어버리자 유연성이 증가합니다.

함수 이름이 abc가 될 수 있습니다.

일단 함수형 프로그래밍함수 자체를 가지고

변수를 다루듯이 여기저기 조합해서 사용할 수 있기 때문에

 

프로그램을 읽기에는 약간 어려워질 수 있습니다.

하지만 코드가 굉장히 유연해지기 때문에 코드를 짧게 쓸 수 있죠.

왜냐하면 재사용 가능한 것들이 많아지기 때문에

그래서 함수형 프로그래밍을 사용해서

프로그램 할 때는 코드가 약간 복잡해질 수 있으나

간략하고, 짧은 표현이 가능합니다.

 

 

🧪 람다식

람다식(Lambda Expression)이란?

- 익명 함수의 하나의 형태로 이름 없이 사용 및 실행이 가능
- 람다 대수(Lambda calculus)로부터 유래

그러면 함수형 프로그래밍의 대표적인 람다식 개념을 이야기해보겠습니다.

일단 람다식이라는 표현은 수학적인 표현에서 넘어왔습니다.

일단 이름이 없는 함수람다라고 표현합니다.

람다식그런 함수로 이루어진 식이라는 뜻입니다.

익명 함수는 이름이 없기 때문에

특정 이름으로 함수를 실행하는 것이 아닌

람다라는 식 자체일종의 익명 함수로서 사용하게 되는 것입니다.

이게 하나의 변수처럼 쓸 수 있는 것이죠.

 

[출처] 부스트코스 코틀린 강의자료

화살표 기호가 중점입니다.

처리하고자 하는 인자를 람다식에 들어갈 함수 인자왼쪽

해당 처리문의 결과오른쪽에 배치합니다.

 

람다식의 이용

- 람다식은 고차 함수에서 인자로 넘기거나 결과값으로 반환 등을 할 수 있다.

함수 안에 또 다른 함수를 넣을 수 있다는 것입니다.

 

 

📐 일급 객체

일급 객체(First Class Citizen)?

- 일급 객체는 함수의 인자로 전달할 수 있다.
- 일급 객체는 함수의 반환값에 사용할 수 있다.
- 일급 객체는 변수에 담을 수 있다.

일급 객체는 영어로 보면 일등석이라고 할 수 있습니다.

일등석은 권한이 많이 주어지고 할 수 있는 것이 많아지죠.

여러분이 사용하고 있는 객체 자체

권한이 많아지고 사용할 수 있는 것들이 많아지는 것이죠.

그래서 뭘할 수 있냐면 함수의 인자로 전달이 가능합니다.

그래서 이 객체가 함수의 인자로 들어갈 수 있기 때문에

함수의 인자로 함수가 들어가는 거죠.

함수의 반환값에도 사용할 수 있고, 변수에도 담을 수 있습니다.

이렇게 할 수 있는 일이 많답니다.

 

코틀린에서 함수는 1급 객체로 다룸

- 1급 함수라고도 한다.

이 함수를 인자로, 반환값, 변수에 담을 수 있습니다.

 

 

💼 고차 함수의 이해

고차 함수(high-order function)?

[출처] 부스트코스 코틀린 강의자료

고차 함수함수에 또 다른 함수를 넣을 수 있습니다.

위의 함수에 인자로 3가 보입니다.

 

 

[출처] 부스트코스 코틀린 강의자료

그림으로 보면 더 분리가 가능합니다.

함수의 인자sum, a, b가 있고

sum에는 익명의 람다식 형태로 선언되어 있습니다.

이런 형태의 모습을 갖춘 람다식만 들어갈 수 있습니다.

a, bInt 정수형으로 존재합니다.

 

그러면 이 내부에서 사용할 때 이 sum이 람다식으로 대체될 수 있죠.

sum : (Int, Int) -> Int

a, b는 각각 람다식의 인자로서 들어가게 되고 이 식은 오른쪽의 결과물로 내보낼 수 있습니다.

중괄호 {}를 사용해서 첫 번째 인자 람다식을 사용합니다.

x+y라는 결과물로 돌려주게 합니다.

 

결국, ab더해진 다음, 해당 결과정수형으로 반환하게 됩니다.

나머지 1020은 각각 ab에 전달됩니다.

람다 함수를 집어 넣어서 구성한 함수를 고차함수라고 할 수 있습니다.

 

 

 

 

오늘은 드디어 함수형 프로그래밍에 대해

제대로 배우기 시작하는 시간이었어요.

 

강의자료에서 개념만 나왔다면

이해하기 좀 어려웠을 것 같아요.

처음 보는 다소 생소한 개념들이 많았으니까요.

그래도 다양한 함수 예시들로 

차근차근 설명해주셔서 

처음치고는 쉽게 받아들일 수 있었어요.

 

저는 자바를 조금 배워서 그런지

함수형 프로그래밍도 가능한 코틀린이

더 매력적으로 다가오기 시작하네요.

여러분은 어떠신가요?

 

그럼 다음 시간에 만나요!

 

 

 

부스트코스 서포터즈 3기 codingTrip