반응형
함수
확장함수
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 |