티스토리 뷰

Programming/Kotlin

Kotlin Function

Albothyl 2022. 5. 14. 13:44

Function 기본

// Kotlin 함수는 다음 fun키워드를 사용하여 선언됩니다.
// 컴파일러에서 리턴타입을 추론할 수 있는 경우 리턴타입을 생략할 수 있다.
fun double(x: Int): Int {
    return 2 * x
}

// 함수가 단일 표현식인 경우 중괄호를 생략할 수 있고 본문은 =기호 뒤에 지정됩니다.
fun double(x: Int): Int = x * 2

// 함수는 표준 접근 방식을 사용하여 호출됩니다.
val result = double(2)

// 멤버 함수 호출은 점 표기법을 사용합니다.
Stream().read()

// 함수 매개변수는 파스칼 표기법- 이름 : 유형 을 사용하여 정의됩니다.
// 매개변수는 쉼표로 구분되며 각 매개변수는 명시적으로 입력해야 합니다.
fun powerOf(number: Int, exponent: Int): Int { /*...*/ }

// 함수 매개변수를 선언할 때 후행 쉼표 를 사용할 수 있습니다 .
fun powerOf(number: Int, exponent: Int,): Int { /*...*/ }

// 함수 매개변수는 해당 인수를 건너뛸 때 사용되는 기본값을 가질 수 있습니다.
// 함수를 호출할 때 모든 인수의 이름을 지정할 필요는 없습니다.
// 기본값을 사용하여 특정 인수를 건너뛸 수도 있습니다. 그러나 건너뛴 첫 번째 인수 뒤에는 모든 후속 인수의 이름을 지정해야 합니다.
fun reformat(
    str: String,
    normalizeCase: Boolean = true,
    upperCaseFirstLetter: Boolean = true,
    divideByCamelHumps: Boolean = false,
    wordSeparator: Char = ' ',
) { /*...*/ }

reformat(
    "String!",
    false,
    upperCaseFirstLetter = false,
    divideByCamelHumps = true,
    '_'
)

// 기본 매개변수 뒤의 마지막 인수가 람다 이면 이름이 지정된 인수로 전달하거나 괄호 외부에 전달할 수 있습니다.
fun foo(
    bar: Int = 0,
    baz: Int = 1,
    qux: () -> Unit,
) { /*...*/ }

foo(1) { println("hello") }     // Uses the default value baz = 1
foo(qux = { println("hello") }) // Uses both default values bar = 0 and baz = 1
foo { println("hello") }        // Uses both default values bar = 0 and baz = 1

fun foo(vararg strings: String) { /*...*/ }

// 함수가 유용한 값을 반환하지 않으면 반환 유형은 Unit입니다.
// Unit은 생략할 수 있습니다.
fun printHello(name: String?): Unit {
    println("Hello $name")
}

// vararg 연산자를 사용하여 가변 개수의 인수를 전달할 수 있습니다 
// 함수의 인자값중 1개만 vararg 를 적용할 수 있다.
// 함수 인자값이 여러개인데 vararg 연산자가 적용된 인자가 마지막이 아니라면 매개변수 이름을 직접 명시하거나, 스프레드 연산자 (*)를 사용한다.
fun <T> asList(vararg ts: T): List<T> {
    val result = ArrayList<T>()
    for (t in ts) // ts is an Array
        result.add(t)
    return result
}

val a = intArrayOf(1, 2, 3) // IntArray is a primitive type array
val list = asList(-1, 0, *a.toTypedArray(), 4)

 

Infix

// 멤버 함수 또는 확장 함수 여야 합니다.
// 단일 매개변수가 있어야 합니다.
// 매개변수는 가변 개수의 인수를 허용 하지 않아야 하며 기본값 이 없어야 합니다.
infix fun Int.shl(x: Int): Int { ... }

// calling the function using the infix notation
1 shl 2
// is the same as
1.shl(2)

infix 함수는 항상 수신자와 매개변수를 모두 지정해야 합니다. infix 표기법을 사용하여 현재 수신자에서 메소드를 호출할 때 this명시적으로 사용하십시오. 이는 명확한 구문 분석을 위해 필요합니다.
class MyStringCollection {
    infix fun add(s: String) { /*...*/ }

    fun build() {
        this add "abc"   // Correct
        add("abc")       // Correct
      //add "abc"        // Incorrect: the receiver must be specified
    }
}

infix 함수 호출은 산술 연산자, 유형 캐스트 및 연산자보다 우선 순위가 낮습니다.
1 shl 2 + 3 is equivalent to 1 shl (2 + 3)
0 until n * 2 is equivalent to 0 until (n * 2)
xs union ys as Set<*> is equivalent to xs union (ys as Set<*>)

infix 함수 호출의 우선 순위는 부울 연산자 &&및 ||, is- 및 in-checks 및 기타 일부 연산자의 우선 순위보다 높습니다.
a && b xor c is equivalent to a && (b xor c)
a xor b in c is equivalent to (a xor b) in c
 
 
 

 

Scope

// Kotlin은 다른 함수 내부의 함수인 로컬 함수를 지원합니다.
fun dfs(graph: Graph) {
    fun someLocalFunction(current: Vertex, visited: MutableSet<Vertex>) {
        if (!visited.add(current)) return
        for (v in current.neighbors)
            someLocalFunction(v, visited)
    }

    someLocalFunction(graph.vertices[0], HashSet())
}

// 지역 함수는 외부 함수(클로저)의 지역 변수에 접근할 수 있습니다. 위의 경우 visited지역 변수가 될 수 있습니다.
fun dfs(graph: Graph) {
    val visited = HashSet<Vertex>()
    fun dfs(current: Vertex) {
        if (!visited.add(current)) return
        for (v in current.neighbors)
            dfs(v)
    }

    dfs(graph.vertices[0])
}

 

 

'Programming > Kotlin' 카테고리의 다른 글

Kotlin Lambda  (0) 2022.05.14
Kotlin Reflection  (0) 2022.04.30
Kotlin Generic  (0) 2022.04.30
Kotlin Null Safety  (0) 2022.04.23
Kotlin Loop  (0) 2022.04.23
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함