본문 바로가기

프로그래밍/코틀린

[코틀린] 순수함수로 정의 될 수 있는 함수

순수함수를 한마디로 정의하면 부수효과가 발생하지 않는, 

그래서 같은 매개변수 값으로 함수를 이용하면 항상 같은 값을 반환하는 함수를 의미한다.

 

여기서 말하는 부수효과는 뭘까?

- 함수 외부의 다른 값을 변경하지 않는다.

- 함수 내부에서 별도의 입출력이 발생하지 않는다. (파일, 데이터베이스, 네트워크 등)

 

[랜덤 값이 발생하는 함수]

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
}

위이 함수는 매개변수가 있다. 그리고 부수효과도 없고, 함수 외부의 데이터를 변경하지도 않는다.

그러므로 순수함수이다.

 

하지만 반환값이 없다.

함수형 프로그래밍은 함수를 변수처럼 다루고자 하는 개념인데,

함수이 반환값이 없다면 실행 결과값이 없다는 의미다.

그 결과 의미 없는 순수 함수가된다.

 

즉 위의 경우들을 종합해보면

순수 함수는 매개변수와 반환값을 가지는 함수로 같은 인수를 전달하여 함수를 호출하면 항상 같은 결과값이 나와야하고 함수 내에서 부수효과가 발생하지 않아야한다.