확장함수
등장배경
- Kotlin은 Java와 완벽하게 호환되는 것을 목표로 하고 있음
- 기존 Java코드 위에 Kotiln코드를 자연스럽게 추가하고 싶다
- Java로 이루어진 코드를 유지보수할 때 kotlin코드를 사용하고 싶다.
- 어떤 클래스 안에 있는 함수처럼 사용하지만, 밖에서 만들 수 있도록 하려는 의도
fun String.lastChar() : Char { // 수신객체 타입 : String, 수신 객체를 this로 접근
return this.[this.length - 1]
}
val str : String = "ABC"
str.lastChar()
- 확장함수에서는 private, protected한 함수를 가져오는 것은 불가능 함
- 캡슐화가 깨지기 때문
같은 이름의 확장함수
//Java
public class Person {
//.....
public int nextYear(){
println("멤버함수")
return this.age + 1;
}
//////////////
//Kotlin
fun Person.nextYear(){
println("확장함수")
return this.age + 1;
}
//////////////
//result
// "멤버함수"
- 멤버함수와 확장함수의 시그니처가 같다면 멤버함수가 우선순위로 호출됨
- 때문에 같은 이름의 확장 함수가 선언되면 예기치 못한 오류가 발생함
확장함수의 오버라이드

open class Train {
fun Train.IsExpensive(){
println("train")
}
}
class Srt : Train("SRT", 10000)
fun Srt.IsExpensive(){
println("SRT")
}
val train : Train = Train()
train.IsExpensive() // result : "train"
val srt1 : Train = Srt()
srt1.IsExpensive() // result : "train"
val srt2 : Srt = Srt()
srt2.IsExpensive() // result : "SRT"
- 해당변수의 현재 타입, 정적인 타입에 의해 어떤 확장함수가 호출 될지 결정된다.