본문 바로가기
Java & Kotlin/Kotlin

[Kotlin] 함수

by heekng 2022. 7. 7.
반응형

함수

확장함수

Kotlin

fun main() {
    val str = "ABC"
    println(str.lastChar())
    println(str.lastChar)
}

fun String.lastChar(): Char {
    return this[this.length - 1]
}

val String.lastChar: Char
    get() = this[this.length - 1]
  • 코틀린은 자바와 100% 호환되기를 목표로 했다.
    • 기존 Java 코드 위에 자연스럽게 코틀린 코드를 추가하려 했다.
    • -> 어떤 클래스 안에 있는 메서드처럼 호출할 수 있지만, 함수는 밖에 만들 수 있게 하자!
  • fun 확장하려는클래스.함수명을 이용해 함수를 확장한다.
    • 함수 안에서는 this를 통해 인스턴스에 접근 가능하다.
    • this: 수신객체
    • 확장하려는 클래스: 수신객체 타입
  • 원래 확장하려는 클래스에 있는 멤버함수처럼 사용할 수 있다.
  • 클래스 밖에서 멤버함수를 작성할 때, 확장함수에서 private 또는 protected 멤버를 이용한다면?
    • 캡슐화가 깨진다
    • 그래서 확장함수는 클래스에 있는 private 또는 protected 멤버를 가져올 수 없다.
  • 멤버함수와 확장함수의 시그니처가 같다면?
    • 멤버함수가 우선적으로 호출된다.
    • 확장함수를 만들었지만, 다른 기능의 똑같은 멤버함수가 생기면 오류가 발생할 수 있다.
  • 확장함수가 오버라이드 된다면?
    • 해당 변수의 현재 타입에 맞추어 확장함수가 호출된다.
  • 자바에서는 코틀린의 확장함수를 정적 메서드(static)을 호출하듯이 사용할 수 있다.
  • 확장함수 개념은 확장 프로퍼티와도 연결된다.
    • 확장 프로퍼티의 원리는 확장함수 + custom getter와 동일하다.

infix 함수

Kotlin

fun main() {
    3.add(4)

    3.add2(4)
    3 add2 4
}

fun Int.add(other: Int): Int {
    return this + other
}

infix fun Int.add2(other: Int): Int {
    return this + other
}
  • 중위함수, 함수를 호출하는 새로운 방법
  • downTo, step도 함수이다. -> 중위 호출 함수이다.
  • fun 앞에 infix를 붙임으로서 사용할 수 있다.

inline 함수

Kotlin

inline fun Int.add3(other: Int): Int {
    return this + other
}
  • fun 앞에 inline 키워드를 이용해 사용할 수 있다.
  • 함수가 호출되는 대신 함수를 호출한 지점에 함수 본문을 그대로 복사하고 싶은 경우에 사용한다.
  • 함수를 파라미터로 전달할 때 오버헤드를 줄일 수 있다.
    • 하지만 inline 함수의 사용은 성능 측정과 함께 신중하게 사용되어야 한다.

지역함수

Kotlin

fun createPerson(firstName: String, lastName: String): Person {
    /*
    if (firstName.isEmpty()) {
        throw IllegalArgumentException("firstName은 비어있을 수 없습니다. 현재 값: ${firstName}")
    }

    if (lastName.isEmpty()) {
        throw IllegalArgumentException("lastName은 비어있을 수 없습니다. 현재 값: ${lastName}")
    }
     */

    fun validateName(name: String, fieldName: String) {
        if (name.isEmpty()) {
            throw IllegalArgumentException("${fieldName}은 비어있을 수 없습니다. 현재 값: ${name}")
        }
    }
    validateName(firstName, "firstName")
    validateName(lastName, "lastName")

    return Person(firstName, lastName)
}
  • 지역함수는 함수 안에 함수를 선언하는 것이다.
  • 함수로 추출하면 좋을 것 같은데, 이 함수를 지금 함수 내에서만 사용하고 싶을 때 사용한다.
  • depth가 깊어지고, 코드가 깔끔하지는 않다.
반응형

'Java & Kotlin > Kotlin' 카테고리의 다른 글

[Kotlin] 여러가지 기능  (0) 2022.07.07
[Kotlin] 컬렉션을 함수형으로 사용하기  (0) 2022.07.07
[Kotlin] 람다  (0) 2022.07.07
[Kotlin] 배열과 컬렉션  (0) 2022.07.07
[Kotlin] Data, Enum, Sealed 클래스  (0) 2022.07.06
[Kotlin] 중첩 클래스를 다루는 방법  (0) 2022.07.06