상세 컨텐츠

본문 제목

함수형 프로그래밍은 왜 필요할까?

노베이스도 이해하는 공학이야기

by Tabris4547 2023. 7. 18. 23:21

본문

728x90

프로그래밍을 배울 때

함수를 사용한다는 것은 다들 잘 배우셨을 겁니다.

그렇다면 함수형 프로그래밍이라는 말을 들어보셨나요?

이건 대체 무슨 소리야?하실 분들을 위해

왜 함수형 프로그래밍이 중요하고 어떻게 쓰는지 정리해보겠습니다.

 

함수형 프로그래밍이란?

 

함수형 프로그래밍에 대한 예시를 먼저 볼까요?

// 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라는 인자를 만들어서

리턴을 해줘야합니다.

 

 

함수형 프로그래밍을 더욱 편하게 만들 고차함수들

 

filter

 

fun test()
{
    val example= mutableListOf(1,2,3)
    val f=example.filter { it>1 }
    
}

 

filter함수는 리스트에서 조건에 만족하는 인자만 필터링해주는 함수입니다.

위의 예시는, example이라는 리스트에서 1보다 큰 인자만 받기위해

filter를 활용한 예시입니다.

 

take

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을 받습니다.

 

drop

 

fun test()
{
    val example= mutableListOf(1,2,3,4,5,6,7,8)
    val t=example.drop(3)

}

take랑 반대 개념의 drop도 있습니다.

take는 앞에서부터 몇까지 받는거라면

drop은 앞에서부터 몇까지 버리는 지를 명령하는 함수입니다.

 

map

fun test()
{
    val example= mutableListOf(1,2,3,4,5,6,7,8)
    val t=example.map{it*3}

}

map함수는 원소들에 어떤 함수를 계산하고

변환한 리스트를 받아주는 함수입니다.

예시에서는 인자에 3을 곱하고 복사하는 과정입니다.

 

 

 

 

https://mangkyu.tistory.com/111

https://kotlinworld.com/12

 

[Kotlin Collection] 2. Kotlin filter, take, drop 을 이용해 데이터 필터링 하기

목차로 돌아가기 [Kotlin Collection] Kotlin에서 확장함수를 이용해 Collection 조작하기 목표 Collection 확장함수가 하는 일을 이해한다. 자유롭게 확장 함수를 이용해 데이터를 조작한다. 개요 Kotlin에서

kotlinworld.com

https://medium.com/depayse/kotlin-collections-%ED%95%A8%EC%88%98-2-%ED%95%84%ED%84%B0-%EC%A1%B0%EA%B1%B4-%EA%B2%80%EC%83%89-%EB%A7%B5-%ED%94%8C%EB%9E%AB-f83890d21c56

728x90

관련글 더보기

댓글 영역