순수함수를 한마디로 정의하면 부수효과가 발생하지 않는,
그래서 같은 매개변수 값으로 함수를 이용하면 항상 같은 값을 반환하는 함수를 의미한다.
여기서 말하는 부수효과는 뭘까?
- 함수 외부의 다른 값을 변경하지 않는다.
- 함수 내부에서 별도의 입출력이 발생하지 않는다. (파일, 데이터베이스, 네트워크 등)
[랜덤 값이 발생하는 함수]
fun some(a:Int):Int{
return (Math.random()*a.toInt()
}
위의 함수는 매번 some(10)으로 호출하더라도 결과값이 매번 다르게 반환하므로 순수함수가 아니다.
[파일 입출력이 발생하는 함수]
fun some1(a:String):Boolean{
try{
val file = File("a.txt")
val out = FileWriter(file)
out.wirte(a)
out.flush()
return true
}catch (e: Exception){
return false
}
}
함수 내부에서 파일 입출력이 발생한다. 부수효과가 발생하므로 순수함수가 아니다.
[더하는 함수]
fun some2(a: Int, b: Int){
return a + b
}
위의 함수는 같은 매개변수 값을 호출하면 항상 같은 값을 반환한다.
그리고 부수효과가 발생하지 않는다.
즉, 함수 외부의 변숫값을 변경하지도 않고, 함수 내에서 별도의 입출력이 발생하지도 않는다.
따라서 위의 함수는 순수함수라고 말할 수 있다.
[매개변수가 없는 함수]
fun some3(): Int{
return 10
}
부수효과가 발생하지 않는 의미에서, 그리고 호출 시 매번 같은 값을 반환한다는 의미로 순수함수는 맞다.
하지만 의미가 없는 순수함수이다.
그 이유는 매개변수가 없기 때문이다.
순수 함수는 함수 외부에서 선언된 데이터 값을 변경하지도 않고,
별도의 입출력도 없는 함수이므로 매개변수가 없으면 함수로서의 의미가 없기 때문이다.
이런 경우 그냥 상수로 정의하는것이 더 낫다.
[반환값이 없는 함수]
fun some4(a : Int, b : Int){
val result = a + b
}
위이 함수는 매개변수가 있다. 그리고 부수효과도 없고, 함수 외부의 데이터를 변경하지도 않는다.
그러므로 순수함수이다.
하지만 반환값이 없다.
함수형 프로그래밍은 함수를 변수처럼 다루고자 하는 개념인데,
함수이 반환값이 없다면 실행 결과값이 없다는 의미다.
그 결과 의미 없는 순수 함수가된다.
즉 위의 경우들을 종합해보면
순수 함수는 매개변수와 반환값을 가지는 함수로 같은 인수를 전달하여 함수를 호출하면 항상 같은 결과값이 나와야하고 함수 내에서 부수효과가 발생하지 않아야한다.
'프로그래밍 > 코틀린' 카테고리의 다른 글
[코틀린] 고차함수 - 함수 반환 (0) | 2020.03.19 |
---|---|
[코틀린] 고차함수 - 매개변수 대입 (0) | 2020.03.19 |
[코틀린] 람다 표현식 (0) | 2020.03.04 |
[코틀린] 일급 객체로서의 함수 (0) | 2020.03.04 |
[코틀린] 함수형 프로그래밍이란? (0) | 2020.02.29 |