프로그래밍을 배울 때
함수를 사용한다는 것은 다들 잘 배우셨을 겁니다.
그렇다면 함수형 프로그래밍이라는 말을 들어보셨나요?
이건 대체 무슨 소리야?하실 분들을 위해
왜 함수형 프로그래밍이 중요하고 어떻게 쓰는지 정리해보겠습니다.
함수형 프로그래밍에 대한 예시를 먼저 볼까요?
// 1 ~ 10까지의 값이 i에 할당된다
for(int i = 1 ; i < 10; i++){
System.out.println(i);
}
우리가 흔히 보는 반복문입니다.
이걸 함수로 나타내겠다 생각해보신 적 있나요?
process(10, print(num));
위의 프로그래밍을 다음과 같이 함수로 나타낸 방식입니다.
쉽게 말해서 "평소에 프로그래밍하던 걸 함수형태로 나타낸다"라는 건데
이렇게 보면 "굳이"이렇게 까지 할 이유가 있나 싶은 생각이 듭니다.
그냥 함수로 나타내면 끝 아닌가??
하지만 함수형 프로그래밍의 함수는 특별한 조건이 있습니다.
바로 '순수함수'(pure function)이라는 것
순수함수라고 하면 오로지 매개변수만을 취급하고
동일한 값을 주면 같은 결과만을 내보내야합니다.
순수함수가 아닌 예시를 먼저 보겠습니다.
val x:Int=4
fun tmp():Int
{
val a=3
val b=4
return a+b+x
}
tmp라는 함수를 볼까요?
인자를 받지도 않았으며
추후에 함수 안에 a,b값이 바뀌면 return도 바뀌겠군요.
val x:Int=4
fun tmp(a:Int,b:Int):Int
{
return a+b+x
}
그럼 이건??매개변수를 활용해서 return했으니깐 된 게 아닐까?
아니죠. 이것도 전역변수인 x값에 따라서 바뀌게 됩니다.
const val x:Int=4
fun tmp(a:Int,b:Int):Int
{
return a+b+x
}
만약 이렇게 수정한다면 순수함수가 됩니다.
이제는 x가 상수로 값이 고정되기 때문에
어떤 값을 넣든 동일한 결과가 되기 때문이죠.
다른 예시를 더 볼까요?
fun tmp(a:class,b:class):class
{
a.name=b.name
return a
}
a와 b에 클래스를 받고
a 안의 name이라는 인자를
b 안의 name인자와 같게 만들어주고 a를 리턴합니다.
이 경우도 순수함수 조건에 맞지 않습니다.
순수함수는 "Only Read"
즉, 인자값을 읽어오는 것만 가능하기 때문.
fun tmp(a:class,b:class):class
{
val c:class=class()
c.name=b.name
return c
}
만약에 순수함수대로 표현을 한다면,
아예 새로운 c라는 인자를 만들어서
리턴을 해줘야합니다.
fun test()
{
val example= mutableListOf(1,2,3)
val f=example.filter { it>1 }
}
filter함수는 리스트에서 조건에 만족하는 인자만 필터링해주는 함수입니다.
위의 예시는, example이라는 리스트에서 1보다 큰 인자만 받기위해
filter를 활용한 예시입니다.
fun test()
{
val example= mutableListOf(1,2,3,4,5,6,7,8)
val t=example.take(3)
}
take함수는 앞에서부터 몇개를 받을지에 대한 함수입니다.
take(3)을 했으니 앞에서부터 3개인 1,2,3을 받습니다.
fun test()
{
val example= mutableListOf(1,2,3,4,5,6,7,8)
val t=example.drop(3)
}
take랑 반대 개념의 drop도 있습니다.
take는 앞에서부터 몇까지 받는거라면
drop은 앞에서부터 몇까지 버리는 지를 명령하는 함수입니다.
fun test()
{
val example= mutableListOf(1,2,3,4,5,6,7,8)
val t=example.map{it*3}
}
map함수는 원소들에 어떤 함수를 계산하고
변환한 리스트를 받아주는 함수입니다.
예시에서는 인자에 3을 곱하고 복사하는 과정입니다.
프로세스 관리는 어떻게 이뤄질까? (0) | 2023.07.21 |
---|---|
SW테스트에 대해서 알아보자 (0) | 2023.07.19 |
객체지향은 왜 필요할까? (2) | 2023.07.17 |
컴퓨터는 어떻게 데이터를 전송할까? 씨리얼 통신을 알아보자 (0) | 2023.05.26 |
IOT시대?? IOT란 대체 무엇일까?? (0) | 2023.05.25 |
댓글 영역