본문 바로가기
프로그래밍 공부흔적/Kotlin

[부스트코스/Kotlin]함수형 프로그래밍이란?

by 뷕뺙쀡 2021. 1. 26.

부스트코스 서포터즈 3기 활동으로서
코틀린 프로그래밍 기본 1/2(함수편)을 듣고 작성된 포스팅입니다


함수 선언 후 호출 방법

1) 코틀린의 함수 선언 방법

일반적인 함수 선언 방법

fun sum(a: Int, b: Int): Int {
//fun 함수 이름(변수 이름: 자료형, 변수 이름: 자료형…): 반환값의 자료형 
    println("a는 $a, b는 $b") //표현식…
    return a + b //return 반환값
}
//fun sum(a:Int,b:Int)=a+b 이렇게 생략할 수도 있다

 

반환값이 없는 함수

fun printName(name:String): Unit {
//Unit를 생략하고 fun printName(name:String) 가능
    println("내 이름은 $name입니다") //표현식…
}

 

매개변수의 기본값을 설정한 함수 : 매개변수의 기본값을 지정하면 인자를 전달하지 않고도 함수를 실행할 수 있다.  코틀린은 매개변수의 이름과 함께 인자를 전달하는 방법을 제공하여 매개변수의 기본값도 미리 확인할 수 있다.

fun sumPlus(base:Int=0, plusA:Int, plusB:Int = 20):Unit{
//매개변수 base와 plusB는 기본값을 지정함
    println("합은 ${base+plusA+plusB}입니다")
}

//매개변수가 지정된 함수 사용 예제
fun main(){
    sumPlus(plusA=10) // 출력:30, 기본값이 정해지지않은 plusA의 값만 지정
    sumPlus(0,0,0) // 출력:0, 모든 인자에 값을 주어 기본값은 무시됨
    sumPlus(10,10) // 출력:40, 순서대로 base,plusA에 값이 지정, plusB는 기본값
}

 

가변인자를 가진 함수 : '인수가 변한다'라는 뜻의 가변 인자(variable arguments)를 사용하면 함수는 하나만 정의해놓고 다양한 개수의 인자를 받을 수 있습니다. 인자 앞에 vararg라고 선언하면,  가변인자가 되고 이는 배열처럼 인식되기 때문에 for(name in names)와 같이 사용될 수 있는 것이다.

fun callNames(vararg names: String) {
    print("Hello! ")
    for (name in names) { print("$name ") }
}
fun main(){
    callNames("Amy","James","Alice","Jack")
    //Hello! Amy James Alice Jack 
}

 

2) 함수 호출의 원리 : 스택 프레임 

스택 프레임이란? : 메모리의 스택(stack) 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역으로 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다. 함수가 호출되면 스택에는 함수의 매개변수, 호출이 끝난 뒤 돌아갈 반환 주소값, 함수에서 선언된 지역 변수 등이 저장된다. 이렇게 스택 영역에 차례대로 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 한다. 이러한 스택 프레임 덕분에 함수의 호출이 모두 끝난 뒤에, 해당 함수가 호출되기 이전 상태로 되돌아갈 수 있다.

참고:www.tcpschool.com/c/c_memory_stackframe

 

+ 함수 활용 예제  해답

fun avgFunc(initial:Float=0f, vararg numbers:Float):Double{
	var result = 0f
	for (num in numbers) { result+=num }
	println("result: $result, numbers.size: ${numbers.size}")
	val avg = (result/(numbers.size)).toDouble()
	return avg+initial
}
fun main() {
    val result = avgFunc(5f, 100f, 90f, 80f) 
    // 첫번째 인자: 초기값, 이후 인자는 가변인자
    println("avg result: $result")
}

 

코틀린의 함수형 프로그래밍 패러다임

1) 함수형 프로그래밍은 순수 함수를 지향한다

순수함수란? 부작용(side-effect)이 없는 함수
동일한 입력 인자에 대해서는 항상 같은 결과를 출력 or 반환하여 값을 예측가능(deterministic).
즉, 1) 같은 인자에 대해서 항상 같은 값을 반환하고 2) 함수 외부의 어떤 상태도 바꾸지 않는 함수!

순수 함수를 프로그래밍에 사용하는 이유는?
-입력과 내용을 분리하고 모듈화하므로 재사용성†(여러 함수와 조합해도 부작용X) 
-특정 상태에 영향을 주지 않으므로 병행 작업 시 안전하다. 
-함수의 값을 추적하고 예측할 수 있기 때문에 테스트, 디버깅 등이 유리하다.

함수형 프로그래밍은 순수 함수를 조합해 상태 데이터 변경이나 부작용이 없는 루틴을 만들어내며 이름 없는 형태의 하나인 람다식을 이용해 함수를 변수처럼 매개변수, 인자, 반환값 등에 활용하는 고차함수를 구성해 생산성을 높인 프로그래밍 방법

//순수 함수인 함수
fun sum(a:Int,b:Int):Int=a+b
//a와 b에 어떤 값이 들어오든 항상 a+b 반환

//순수 함수가 아닌 함수
global BASE = 100
fun main(){
    val sum=sumBase(10,20)
}
fun sumBase(a:Int,b:Int){//순수함수가 아님
    return a+b+BASE
    //입력값과 무관하게 외부값을 사용함
}

 

2) 람다식과 고차 함수

람다식이란? 람다 대수로부터 유래하였으며 익명 함수의 하나의 형태, 이름 없이 사용 및 실행 가능하다. 그래서 고차 함수에서 인자로 넘기거나 결과값으로 반환하는 것이 가능하다.

일급 객체란? 1)함수의 인자로 전달 가능, 2)함수의 반환값에 사용 가능, 3)변수에 담을 수 있는 객체
코틀린에서 함수는 1급 객체로, 1급 함수라고도 한다.

고차함수란?  다른 함수를 인자로 사용하거나 함수를 결괏값으로 반환하는,  일급 객체 혹은 일급 함수를 서로 주고받을 수 있는 함수

//람다식과 고차함수 실습 예제
fun main() {
    println(highFunc({ x, y -> x + y }, 10, 20)) // 람다식 함수를 인자로 넘김
    //{ x, y -> x + y }는 이름이 없는 함수, 람다식
}
fun highFunc(sum: (Int, Int) -> Int, a: Int, b: Int): Int = sum(a, b)
//람다식을 인자로 갖는 고차함수

람다식과 고차함수에 대한 자세한 내용은 다음 포스팅에 이어서~!!


www.boostcourse.org/mo132

 

코틀린 프로그래밍 기본1/2(함수편)

부스트코스 무료 강의

www.boostcourse.org

댓글