본문 바로가기

개발 코딩 정보 공유/안드로이드 자바 코틀린

함수형 프로그래밍? 그게 뭔데 일급객체 일급시민 고차함수 람다

 

최근에 트랜드 처럼 퍼지고 있는 함수형 프로그래밍. 맨날 자바만 쓰다보니 다소 생소하였는데... 시간을 들여서 조금 알아보고자 작성하게 되었습니다.

 

일급객체

 

다소 생소한 단어인 일급객체는 함수형 프로그래밍을 지원하기 위해 필수 요소 입니다. 그렇기에 함수형 프로그래밍 언어를 쓰기전에 반드시 미리 공부해 둘 필요가 있다고 생각합니다. 많이 쓰던 우리의 자바에는 그런 개념이 없기 때문에 더욱 생소 할 수 있을 것 같습니다. 함수형 프로그래밍에 들어가기 위해 1급 시민(또는 객체) 라 불리우는데 이녀석을 알아야 합니다. 이녀석이 되기 위한 조건은 크게 3가지가 있습니다.

  

" 변수에 담을 수 있다 "

" 파라미터로 전달할 수 있다 "

" 반환값으로 전달할 수 있다 "

 

응? 뭘 전달 한다는 말인가? 숫자형, 문자형? 다 되는거 아닌가?? 자바도 그러면 되지 않나? 라고 생각할 수 있지만

문제는 함수입니다.. 기존의 자바에서는 함수(메서드)를 인자나 리턴으로 전달 할 수가 없습니다. (지원하지 않는다.)

 

 

함수형 프로그래밍

 

함수객체의 전달이 가능해지면 어떤일이 일어나는가? 명령형 프로그래밍을 넘어서 함수형프로그래밍이 가능해진다는 것입니다. 이는 고차함수(high order fucntion) 와 람다식(lambda) 이 있기에 가능한 이야기 입니다. 함수형프로그래밍 자체는 외부상태의 변화 없이 pure 한 함수를 사용함으로써 온전히 내부의 입출력에만 의존하여 작성되는 것을 지향합니다. 또한 필연적으로 익명함수를 쓰게 되는데 이를 람다식으로 표현합니다. (람다식의 경우 자바 1.8부터 지원하고 있죠. 그러나 현장에서 쓰는건... 아직 1.7도 많이 못봤습니다.)

 

1
(int a, int b) -> {return a + b}
cs

 

이와 같이 람다식으로 간략하게 표현이 가능하며, (int a, int b) 가 인자 

{return a + b} 가 리턴값입니다. (인자가 없을수도 있으며, 리턴값이 없을수도 있다. 당연...)

해서 이와같은 요상한 문장의 사용이 가능합니다.

 

 

1
2
3
() -> {}
 
() -> { return 10; }
cs

 

이런식의 타입없이 사용도 가능합니다. (자동 타입추론)

  

1
(x) -> x+1
cs

 

 

 

고차함수의 사용

 

고차함수의 경우 함수안에 함수가... 

아래와 같이 이용이 가능하다.

 

 

 

1
2
3
4
5
6
7
8
var twice = function(f, v) {
return f(f(v));
};
 
 
var f = function(v) {
return v + 3;
};
cs

 

  

고차함수는 다음 편에서 더 알아보겠습니다.

 

 

람다식

https://namu.wiki/w/%EB%9E%8C%EB%8B%A4%EC%8B%9D

 

고차함수

https://ko.wikipedia.org/wiki/%EA%B3%A0%EC%B0%A8_%ED%95%A8%EC%88%98

 

일급객체

https://ko.wikipedia.org/wiki/%EC%9D%BC%EA%B8%89_%EA%B0%9D%EC%B2%B4