안드 공부를 해볼까?

[Kotlin] 순수함수 본문

문법/Kotlin

[Kotlin] 순수함수

문바리 2022. 12. 15. 18:15
728x90

1. 개요

코틀린을 공부하며 순수함수라는 개념이 나왔습니다.

지난 프로젝트에서도 순수함수를 사용해 코드 중복을 방지하라고 팀원이 말했는데 이번기회에 공부할려고 합니다.

(본 게시글은 코틀린 인 액션을 기반으로 작성하였습니다.)

2. 본문

1. 순수함수란 무엇일까?

순수함수는 함수형 프로그래밍의 핵심개념 중 하나에 사용됩니다.

 

- 일급 시민인 함수: 함수를 일반 변수처럼 사용할 수 있습니다.

- 불변성: 일단 만들면 내부 상태가 절대로 바뀌지 않습니다.

- 부수 효과 없음: 입력이 같으면 항상 같은 출력을 내놓고 다른 객체의 상태를 변경하지 않습니다.

 

우리는 부수 효과 없음을 위해 순수함수를 사용합니다.

즉, 순수함수는 어떤 함수에 동일한 인자를 주었을 때 항상 같은 값을 return 하는 함수입니다.

2. 순수함수 구분하기

fun main(){
    val sum1 = sum(10,3)
    val sum2 = sum(3, 20)
    
    print(sum(sum1,sum2))
}

fun sum(a : Int, b: Int) = a + b

sum 함수를 한번 보겠습니다. 단순히 인자 2개를 더하고 return 해줍니다.

이런 함수가 외부의 값을 변하게 하나요? 단순히 인자를 받은 2개를 더해줍니다.

이런 함수를 순수함수라고 합니다.

fun main(){
    val sum1 = sum(10,3)
    val sum2 = sum(10, 2)
    c = 1
    print(sum(sum1, sum2))
}

var c = 2
fun sum(a : Int, b: Int) = a + b + c

반면에 바뀐 sum 함수는 c라는 변수의 값이 변하면 return값도 달라지게 됩니다.

이런 함수는 순수함수가 아닙니다.(하지만 c가 상수라면 순수함수입니다.)

fun main(){
    val sum1 = sum(10,3)
    val sum2 = sum(10, 2)
    c = 1
    print(sum(sum1, sum2))
}

var c = 2
fun sum(a : Int, b: Int) : Int{
    c = a
    return a + b + c
}

이번 함수 또한 순수함수가 아닙니다. c라는 외부 요인이 변경되기 때문입니다.

data class Person(
    val name: String,
    var age: Int? = null
)

fun sumAge(a: Person, b: Person) = a.age?.plus(b.age ?: 0)

fun main() {
    val person1 = Person("hong", 20)
    val person2 = Person("Ryu", 25)
    print(sumAge(person1, person2))
}

이 함수는 순수함수입니다.

객체를 참조할뿐 값을 변경하지 않습니다.

 

이런 순수함수를 사용하면 강력한 추상화를 할 수 있고 코드 중복을 막을 수 있습니다.

물론 꼭 순수함수를 사용하라는건 아니지만 재사용성을 위해 순수함수는 함수형 프로그래밍에서 지향하고 있습니다.

3. 결론

정리하자면 순수함수는 외부 요인을 변경하지 않고 어떤 인자가 들어와도 같은 값을 return 함수입니다.

이는 함수형 프로그래밍의 핵심 개념 중 하나며 사용시, 강력한 추상화 기능을 제공하고 재사용성이 올라갑니다.

 

※참조

https://jeong-pro.tistory.com/23

 

순수 함수란? (함수형 프로그래밍의 뿌리, 함수의 부수효과를 없앤다)

함수형 프로그래밍 함수형 프로그래밍 : 부수 효과를 없애고 순수 함수를 만들어 모듈화 수준을 높이는 프로그래밍 패러다임* 부수 효과 = 외부의 상태를 변경하는 것 또는 함수로 들어온 인자

jeong-pro.tistory.com

 

반응형
Comments