[scala] 함수형 프로그래밍 리뷰

오현우·2022년 11월 10일
0

함수형 프로그래밍

함수형 프로그래밍은 함수들을 적용하고 합치는 것으로 구성된 프로그래밍 페러다임이다.
내 주관적인 함수형 프로그래밍은 수학과 비슷한 프로그래밍 기법이라고 할 수 있다.

특징

순수 함수

기존의 선언적 프로그래밍 기법은 내부에서 인자들을 바꾸면서 진행한다.
하지만 스칼라는 함수들을 활용하여 a -> b 로 진행을 통해 어떤 결과가 나올지 예측가능하며 함수들의 조합을 통해 복잡한 고차 함수들을 구성할 수 있다.

scala code

val a = List("jane", "jon", "mary", "joe")
val b = a.filter(_.startsWith("j"))
         .map(_.capitalize)

python code

a = ["jane", "jon", "mary", "joe"]
b = []
for i in a:
	if i[0] == j:
    	b.append(i.capitalize())

뭐 이렇게 보면 흠 굉장히 비슷한데? temp에 그냥 저장하면 똑같이 되는 거잖아. 라고 할 수도 있겠다.
하지만 scala는 loop 내부 상태를 커스터마이징 하지 않고 다양한 함수들을 조합하여 구현하였다. 이러한 함수들의 조합을 통해 기존 수학적 방법론들을 프로그래밍에 녹일 수 있게 된다.

불변성

메모리에 할당된 정보를 변경하지 않는다.
모든 프로그램은 메모리위에 올라가야만 동작할 수 있다.
함수형 프로그래밍은 변수에 저장된 정보들을 변경하지 않고 다른 변수에 할당함으로써 내부 상태가 변하는 것을 만든다.

구체적으로 위의 파이썬 코드도 temp라는 녀석을 메모리에 올리고 해당 값에 담겨져 있는 정보들을 변경하면서 진행한다. 하지만 스칼라는 메모리에 올려진 내용을 단 한번도 바꾸지 않았다.

이러한 것들을 지켜면 몇가지 장점이 존재한다.

  • 상태 변경 추적의 편리함
  • 무분별한 상태 변경을 제한함

코딩을 몇번 해본다면 디버깅시 제일 어려움을 겪는 것은 로직은 완벽하나 어딘가의 변수의 문제로 디버깅을 어려움을 겪는 것이다.
함수형 프로그래밍은 불변성을 유지함으로써 위와 같은 이점을 갖는다.

순수한 함수란?

순수 함수는 x -> f(x) 라는 관계를 갖는다고 가정했을 때 x의 값이 동일하다면 f(x)값도 항상 동일해야 한다는 논리이다.

위와 같은 내용은 아래의 내용을 함축하고 있다.

  • input parameter를 변경하지 않는다.
  • 어떠한 경우라도 state를 변경하지 않는다.
  • 외부에 영향을 받지 않는다.

순수 함수 예시들!

  • abs
  • ceil
  • max
  • isEmpty
  • length

순수함수가 아닌 것들

  • println()
  • currentTime
  • sys.error

직접 구현한 순수 함수들

scala3

val double(i: Int) = i * 2

@tailRec
val sum(xs: List[Int], acc: Int): Int = xs match
	case Nil => acc -- base case
    case head :: tail => sum(tail, acc + head)
profile
핵심은 같게, 생각은 다르게

0개의 댓글