Functional Lang with kotlin
코틀린으로 함수형 언어를 배워보자!
코틀린은 함수형 언어이면서 동시에 객체 지향적 언어이기도한 다중 패러다임 언어이다. 코틀린 이전에 사용을 하던 자바 또한 자바 8부터 함수형 언어로써의 기능들을 지원하기 시작했다. 코틀린을 사용하면서 함수형 언어를 한번 공부해보고 사용해보자라는 생각이 들었고 오늘은 함수형 언어에 대한 지식을 익혀보자.
함수형 언어란 ?
함수형 프로그래밍은 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다. 명령형 프로그래밍에서는 상태를 바꾸는 것을 강조하는 것과는 달리, 함수형 프로그래밍은 함수의 응용을 강조한다.[위키백과]
함수형 언어는 객체 지향적 언어와 무엇이 다른가 ?
내가 지금 이해하고 있는 패러다임은 객체 지향, 절차 지향 정도이다. 절차 지향의 코드를 C언어를 통해 배우고 Java와 Python으로 객체 지향적인 개념들을 배우고 사용하면서, 코드를 이런식으로 짤 수 있구나..! 참 현실의 동작과 비슷하게 짜는 것이 좋다..!라는 감명을 받았었는데, 함수형 언어는 또 뭐지 ..? 객체 지향적으로 짜는 것도 충분히 불편하거나 안좋은 점이 없는 것 같은데 ? 라는 생각이 들었다.
분명 자바에서도 함수형 언어로써의 기능을 도입하고, 코틀린도 함수형 언어로의 구현이 잘되어있다라는 말을 들었었기에, 함수형 언어는 또 다른 매력과 장점이 있구나 하는 생각이 들었고, 함수형 언어가 어떤 것인지 알아보기위해 헬스장에서 유튜브로 함수형 언어 관련 영상을 들었다. 해당 영상에서 함수형 언어와 객체지향적 언어의 차이점을 공장의 프로세스에 비유하여 설명해주는데 그 설명을 듣고 아주 잘 이해를 하였다.
영상링크는 하단의 참고자료에 있다.
영상의 내용을 간단히 정리하면 함수형언어는 함수의 동작으로 진행되며 각각의 함수는 외부의 어떠한 상태 및 변수의 값을 변화시키지 않고 항상 같은 인자에 대해 같은 결과값을 반환한다. 즉 함수형 언어를 사용하면 그냥 필요한 함수들을 선택해서 나열하면 되는 것이다.. 이렇게 함으로써 외부의 변화로인한 오류, 특정 프로세스에서 발생한 오류가 다른 프로세스에 영향을 미치는 등의 부작용으로부터 자유로워 진다.
집에 돌아와 함수형 언어를 검색해보니 공통적으로 고차함수, 람다, 순수 함수와 같은 키워드가 눈에 많이 띈다. 그러면 우선 이 세개 키워드의 의미부터 파악해보자.
람다 :
다른 함수의 인자로 넘기는 함수, 함수의 결괏값으로 반환하는 함수, 변수에 저장하는 함수를 말한다.
다른 함수의 인자로 함수를 넘긴다고..?, 함수의 반환값으로 함수를 반환한다..? 변수에 함수를 저장한다 ..? 이게 무슨 말인지 이해가 어렵다.. 이를 알려면 고차 함수의 개념을 알아야한다.
고차 함수 :
고차함수는 함수를 일반 자료형이나 객체처럼 인자로 받거나, 리턴할 수 있는 함수이다.
이름만 고차함수이지 사용법은 일반 함수와 같다. 다만 함수의 인자로 함수를 받을 수 있고, 리턴도 함수를 리턴할 수 있는 것이다. 따라서 함수를 인자로 받을 때는 인자에 정의하는 부분을 람다 표현식을 이용해 표기한다.
//function1은 인자로 매개변수가 없고, 반환값 또한 없는 함수를 받는다. 따라서 고차함수이다.
fun funtion1(f: ()->Unit){
f()
}
//function2는 인자로 String과 인자를 Int두개를 받고 String을 반환하는 함수를 받는다. 따라서 고차함수이다.
fun function2(f: (Int,Int)->String, str: String){
println(str)
println(f())
}
순수 함수 :
순수 함수는 같은 인자에 대하여 항상 같은 값을 반환한다. 그리고 순수 함수는 함수 외부의 어떤 상태도 바꾸지 않는다.
즉, 헬스장에서 들었던 함수형 언어의 개념관련 유튜브 내용과 연관지어 세개의 키워드를 조합해보면, 함수형 언어는 연속된 함수의 동작으로 코드가 실행되며, 순수함수를 사용하여 부작용을 줄이고 그 순수함수들은 람다 표현식을 이용하여 짤 수 있다!
참고자료 :