Kotlin 기본[3] - 함수형 프로그래밍, 람다

하동혁 ·2023년 3월 30일
0

Kotlin

목록 보기
3/10
post-thumbnail

▪️ 프로그래밍 언어 패러다임

  • 절차 지향 프로그래밍
    • 순서대로 동작하는 프로그래밍 방식
  • 객체 지향 프로그래밍
    • 클래스가 프로그램의 최우선이 되는 프로그래밍 방식
  • 함수형 프로그래밍
    • 함수의 유기적 연결 및 동작이 프로그램의 최우선이 되는 프로그래밍 방식. (함수가 일급 객체로써의 의미를 가짐)

코틀린은 함수형 프로그래밍이다.


▪️ 함수형 프로그래밍이란?

  • 컨셉

    • 변경 가능한 상태를 불변상태로 만들어 부수 효과를 없애자는 것
    • 모든 것은 객체
    • 코드를 간결하게 하고 가독성을 높여 구현할 로직에 집중하자는 목표
    • 동시성 작업을 보다 쉽게 안전하게 구현

  • 변경 가능한 상태를 불변상태로(Immutable)로 만들어 SideEffect를 없애자.

    • 함수의 기본은 f(x) = y
      • 쉽게 말해서 x가 들어가면 항상 y라는 결과가 나와야함

  • 모든 것은 객체이다.

    • 함수형 프로그래밍 언어에서 모든 것이 객체 (클래스 외에 함수 또한 객체)

  • 1급 객체(Fist Class Object)란?

    • 모든 요소는 변수에 할당 할 수 있어야 함
    • 모든 요소는 인자로 넘길 수 있어야 함
    • 모든 요소는 리턴값으로 리턴 할 수 있어야 함

  • Java는 method를 변수에 할당할 수 있고, 인자로 넘길 수 없으며, 리턴할 수 없으므로 일급 객체가 아니다.




▪️ 람다

  • 람다 표현식이란?
    • 람다 함수는 프로그래밍 언어에서 익명 함수를 뜻함
    • 람다의 형태
      • 람다는 fun과 함수이름을 명시하지 않고 축양형으로 선업합니다.
  • { 매개변수 -> 함수내용 }
  • 람다의 규칙
    • 람다 함수는 항상 { }으로 감싸서 표현해야 함
    • { } 안에 "->" 표시가 있으며 "->" 왼쪽은 매개변수, 오른쪽은 함수 내용
    • 매개변수 타입을 선언해야 하며, 추론할 수 있을 때는 생략할 수 있음
    • 함수의 반환 값은 함수 내용의 마지막 표현식
    • 매개변수가 하나인 경우 생략 가능
    • 코드의 마지막 줄은 return type으로 추론됨

일반 함수

//일반함수 add,
fun add(x1:Int, x2:Int):Int {
    return x1 + x2
}

//한줄일 경우 brace 생략하고 = 으로 assign
fun add1(x1:Int, x2:Int):Int = x1 + x2

//return type 생략, 추론가능
fun add2(x1:Int, x2:Int) = x1 + x2
 

람다 함수

val add = { x1: Int, x2: Int -> x1 + x2 }

fun main() {
    val result = add(10, 20)
    println(result)

람다식이 여러줄일때는 마지막 라인을 리턴한다.


람다 함수의 다양한 표현 방식

// 생략되지 않은 전체 표현 방식 
val sum: (Int, Int) -> Int = { x1: Int, x2: Int -> x1 + x2 }

// 선언 자료형 생략 
val sum = {x: Int, t: Int -> x+y } 

// 람다식 매개변수 자료형의 생략 
val sum: (Int, Int) -> Int = {x, y -> x+y}

// 에러 발생.. 추론이 불가능하기 때문 
val sum = {x, y -> x+y}

반환 자료형이 없거나 매개변수가 하나 있을 때

val hello: () -> Unit = {println("Hello")}
val add: (Int) -> Int = {x-> x+x}

선언부의 자료형 생략

val hello = {println("Hello")}
val add = {x:Int-> x+x}

0개의 댓글