본문 바로가기
Kotlin

함수

by oncerun 2023. 1. 15.
반응형

 

1. 확장함수

 

코틀린은 자바와 100% 호환을 목표로 하고 있다. 기존 자바 코드 위에 자연스럽게 코틀린 코드를 추가하려는 고민이 동반된다. 

 

그래서 어떤 클래스 안에 있는 메서드처럼 호출할 수 있지만, 함수는 밖에 만들 수 있도록 하는 개념이 나온다.

fun main() {
    val str = "abc"
    print(str.lastChar())
}

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

 

String 클래스를 확장하는 코드이다. 이 함수 블록 내부에서는 this를 이용해 실제 클래스 안의 값에 접근한다.

 

확장함수가 캡슐화를 위협할 수 있다고 생각할 수 있지만 확장함수는 클래스의 private, protected 멤버자체를 가져올 수 없다.

 

시그니처가 동일할 수 있다. 기능 추가가 아닌 자바 코드에서 코틀린 코드로 변경하되 기존 함수는 남기는 경우 함수의 시그니처가 동일할 수 있는데, 이러한 경우 기존 작성된 클래스멤버 함수가 우선적으로 호출된다.

 

이는 추후 확장함수와 동일한 시그니처를 가진 멤버함수가 추가되는 경우 오류가 발생할 수 있기에 조심해야 하는 부분이다.

 

 

2. infix 함수

 

중위함수는 함수를 호출하는 새로운 방법이다. 

 

downTo, step도 함수이다. 이는 변수.함수이름(arg) 대신 변수 함수이름 arg로 호출하도록 해주는 것을 중위함수라고 한다.

 


fun main() {
    var num = 3
    print(num add 3);
}

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

 

 

3. inline 함수

 

이는 함수가 호출되는 대신, 함수를 호출한 지점에 함수 본문을 그대로 복사하는 것이다.

 

이는 함수를 파라미터로 전달할 때 오버헤드를 줄일 수 있어 사용하지만 이는 성능 측정과 함께 사용되어야 한다.

 

4. 지역함수

 

이는 함수안에 함수를 선언할 수 있는 것이다.

fun createPerson(firstName: String, lastName: String): Person {
    fun validateName(name: String, fieldName: String) {
        if (name.isEmpty()) {
            throw IllegalArgumentException("name is empty : $fieldName")
        }
    }

    validateName(firstName, "firstName")
    validateName(lastName, "lastName")

    return Person(firstName, lastName, 10)
}

 

 

반응형

'Kotlin' 카테고리의 다른 글

Kotlin 테스트 작성을 위한 빌드 업  (0) 2023.01.18
Tip  (0) 2023.01.15
중첩 클래스, 다양한 클래스  (0) 2023.01.15
Object 키워드  (0) 2023.01.12
접근 제어  (0) 2023.01.02

댓글