본문 바로가기
Kotlin/Kotlin 프로그래밍

[Kotlin] 함수와 함수형 프로그래밍 (1)

by 주 녕 2021. 4. 2.
728x90

모든 내용은 Do it! 코틀린 프로그래밍을 바탕으로 정리한 것입니다. 

 

함수 선언하고 호출하기

함수 : 여러 값을 입력받아 기능을 수행하고 결과값을 반환하는 코드의 모음 (코드의 재사용)

fun 함수 이름([변수1: 자료형, 변수2: 자료형...]): [반환값의 자료형] {

        표현식...

        [return 반환값]

}

  • fun 키워드 : 함수 선언
  • 함수 이름
  • 매개변수 정의하기 : 자료형을 명시해야 함
  • 반환값의 자료형 명시 : 반환값이 있다면 자료형을 반드시 명시해야 함
  • 함수의 본문 완성
  • 값 반환 : 반환값이 있을 때만
    • 반환값이 없는 함수 → 반환값의 자료형을 Unit으로 지정하거나 생략 가능 (void와 다름)

간략한 함수

fun sum(a: Int, b: Int): Int {
    return a+b
}
fun sum1(a: Int, b: Int): Int = a+b
fun sum2(a: Int, b: Int) = a+b
  • 중괄호 안의 코드가 한 줄인 경우 : return문을 생략한 대신 대입 연산자(=) 사용 가능
  • 반환값의 자료형이 명확한 경우 : 반환값의 자료형 생략 가능

 

함수 호출과 프로그램의 실행 순서

fun sum(a: Int, b: Int): Int {
    return a+b
}

fun main() {
    val result1 = sum(3, 2)
    val result2 = sum(6, 7)
    
    println(result1)
    println(result2)
}

* 함수를 선언할 때는 매개변수, 함수를 호출할 때는 인자

  1. 프로그램의 진입점 main() 함수
    • 프로그램을 실행하면 프로그램의 진입점 역할을 하는 main() 함수가 가장 먼저 실행됨
  2. 함수의 호출과 함수의 인자
    • sum() 함수를 호출
    • 인자(argument)로 3, 2가 사용되었고, 인자 3, 2는 각각 sum() 함수의 매개변수 a, b로 전달됨
  3. sum() 함수 호출

함수의 호출과 메모리

함수의 각 정보는 프레임(Frame)이라는 정보로 스택 메모리의 높은 주소로부터 거꾸로 자라듯이 채워져 나감지역변수는 함수가 종료되면 스택 프레임과 함께 사라지는 임시 변수

  • 함수가 호출되면 스택에 프레임이 생김
    • 함수 안에 선언된 변수도 분리하여 생각함 → 프레임으로 분리된 변수들 : 지역변수
    • 각 단계에 따라서 제일 아래부터 프레임이 쌓아 올려지면서 함수가 종료되면 쌓였던 프레임이 사라지고 지역 변수들도 같이 삭제됨

매개변수 활용

  • 기본값 기능 :  fun add(name: String, email: String="default") → 호출 시, add("준영")
  • 매개변수 이름과 함수 호출 가능 : sum(a = 1, b = 2)
  • 매개변수의 개수가 고정되지 않은 함수
    • 가변 인자(variable argument) : vararg 키워드 사용
    • fun normalVarargs(vararg counts: Int)

 


함수형 프로그래밍

코틀린은 함수형 프로그래밍(FP: Functional Programming)과 객체지향 프로그래밍(OOP: Object-Oriented Programming을 모두 지원하는 다중 패러다임 언어

 

순수 함수를 작성하여 프로그램의 부작용을 줄이는 프로그래밍 기법

그리고 함수형 프로그래밍에서는 람다식고차함수를 사용함

순수 함수

어떤 함수가 같은 인자에 대해 항상 같은 결과를 반환한다면 '부작용이 없는 함수'

부작용이 없는 함수가 함수 외부의 어떤 상태도 바꾸지 않는다면 '순수 함수' : 결정적, 예측 가능(deterministic)

→ 스레드에 사용해도 안전하고 코드를 테스트하기도 쉬움

※ 프로그램이 커지다 보면 부작용을 완벽하게 통제하기는 어렵기 때문에 최대한 순수함수에 가깝게 구현하려고 해야 함

람다식

  • 람다식은 람다 대수에서 유래한 것
  • in 수학, 람다 대수는 이름이 없는 함수로 2개 이상의 입력을 1개의 출력으로 단순화한다는 개념
  • in FP,
    • 다른 함수의 인자로 넘기는 함수
    • 함수의 결과값으로 반환하는 함수
    • 변수에 저장하는 함수

일급 객체

  • 일급 객체는 함수의 인자로 전달할 수 있음
  • 일급 객체는 함수의 반환값에 사용할 수 있음
  • 일급 객체는 변수에 담을 수 있음

FP에서는 함수, 람다식을 일급 객체로 생각함

일급 객체인 함수 - 일급 함수 / 이름이 없는 일급 객체 - 람다식 함수 or 람다식

고차 함수

다른 함수를 인자로 사용하거나 함수를 결과값으로 반환하는 함수

→ 일급 객체 or 일급 함수를 서로 주고 받을 수 있는 함수

fun main() {
    println(highFunc({x, y -> x+y}, 10, 20))
}

fun highFunc(sum: (Int, Int) -> Int, a: Int, b: Int): Int = sum(a, b)
  • sum : 람다식 매개변수
  • (Int, Int) -> Int : 자료형이 람다식으로 선언된 것
728x90

댓글