[Kotlin] Kotlin Study #3

이제일·2023년 8월 6일
0

Kotlin

목록 보기
3/10

First-class citizen

Kotlin에서 함수는 1급 객체, First-class citizen이다

1급 객체는 아래의 조건을 충족한다.

  1. 변수나 데이타에 할당 할 수 있어야 한다.
  2. 객체의 인자로 넘길 수 있어야 한다.
  3. 객체의 리턴값으로 리턴 할수 있어야 한다.

익명함수

익명 클래스와 같은 역할로 fun키워드 뒤에 이름을 설정하지 않아서,
일회성으로 처리하기 위해 사용

val addResult = fun (a: Int, b: Int) = a + b
printf(addResult(100, 200)) // 300

val addResult = fun (a: Int, b: Int): Int { return a + b }(100, 200)
println(addResult) // 300

람다 표현식

익명 함수를 더 간편하게 작성하는 방법으로, fun 키워드 없이 사용

  • 수학에서 상수를 의미함. 즉, 상수처럼 사용하는 함수를 의미함.
  • 익명함수 보다 함수를 정의하고 상수처럼 인자나 반환값 등을 전달하기 편리함.
  • 다른 함수에 넘길 수 있는 작은 코드 조각을 뜻함.
  • 람다 표현식 표기법
    • 예약어와 함수 이름이 없음
    • 중괄호 안에 직접 매개변수와 표현식을 작성
    • 매개변수와 표현식을 구분하는 기호 -> 로 구분
{ println("아무 인자 없는 람다") } //아무 인자 없는 람다

// 인자가 하나인 경우
println({ x: Int -> x + x}(10)) // print: 20

// 변수에 할당
val result = { x: Int, y: Int -> x + y } 
println(result(1, 2)) // print: 3

// 람다를 인자로 받는 함수
fun highOrderFunction(x: Int, y: Int, f: (Int, Int) -> Int): Int {
	return f(x, y)
}
println(highOrderFunction(1, 2) { x, y -> x * y }) // print: 2


fun returnHighOrderFunction(): () -> Int = { 100 } // 람다를 반환하는 함수
  • 함수를 파라미터로 받는 함수가 마지막에 온 경우엔 , 를 제외할 수 있음.

함수참조

  • 함수 자체를 값으로서 다룰 수 있게 해주는 기능.
  • 더블콜론 :: 을 사용하여 함수를 참조.
  • 리플렉션이란 바이트코드를 이용해 내가 참조하려는 값을 찾기위해 사용.
fun isOdd(x: Int) = x % 2 != 0

val numbers = listOf(1, 2, 3)
println(numbers.filter(::isOdd)) // [1, 3]

filter 함수의 원형

inline fun IntArray.filter(
	predicate:(Int) -> Boolean
)

함수 자료형

fun main() {
    val a: () -> Unit = { println("함수") } // 매개변수와 반환 값이 없는 함수
    val b: (Int) -> Int = { x -> x * 3} // 하나의 매개변수로 처리하고 반환 값은 Int
    val c: (Int, Int) -> Int = { x, y -> x + y} // 두 개의 매개변수로 처리하고 반환 값은 Int

    a() // 함수
    println(b(10)) // 30
    println(c(10, 20)) // 30
}

Nullable 처리

  • invoke라는 호출메서드를 오버라이딩 해서 사용할 수 있음.
class A : Function<Unit> { // 함수 자료형 인터페이스 상속
    operator fun invoke() {
        println("연산1")
    }
}

class MyFunction : () -> Unit { // 함수 자료형 상속
    override fun invoke() {
        println("연산2")
    }
}


fun nullFunc(action: MyFunction?): Unit {
    action?.invoke() // action()
}

object 정의와 표현식으로 호출 연산자 처리

  • 익명객체로 사용
  • 함수 타입 뿐만 아니라, 인터페이스, 클래스가 올 수 있음.
val a = object : (Int, Int) -> Int {
    override fun invoke(x: Int, y: Int): Int {
        return x+y
    }
}

println(a(1,2)) // 3
profile
세상 제일 이제일

0개의 댓글