확장 함수는 [확장을 하려는 대상.함수]로 만들 수 있다고 하였습니다. 여기서 함수는 일반 함수의 형태입니다.
[Remind] 함수의 기본 형태
fun 함수명(변수): Unit {
}
or
fun 함수명(변수): 리턴타입 {
return 값
}
여기에서 '확장을 하려는 대상'을 추가해주면 확장 함수가 됩니다. 엄밀히 말하자면 '확장하려는 대상'에 함수를 추가해주는 것이겠죠.
fun 확장하려는 대상.함수명(변수): Unit {
}
or
fun 확장하려는 대상.함수명(변수): 리턴타입 {
return 값
}
앞서 직접 만든 Car 클래스를 '확장하려는 대상(receiver type)'으로 확장 함수를 만들어 봤습니다. 그런데 Basic Type을 이용하면 좀 더 재미있는 일을 할 수 있을 것 같습니다. Basic Type은 Int, Double, Byte와 같은 Number를 비롯에 Boolean, Array, String까지 다양합니다.
예를 들어 String의 길이를 비교하여 길이가 더 긴 String을 리턴 받는 확장 함수를 만들어 사용할 수 있습니다.
fun main(args: Array<String>) {
println("Hello".getLonggerString("Hi"))
}
fun String.getLonggerString(x: String) : String {
return if(this.length > x.length) this else x
}
Hello
예제를 분석해보면 확장 함수를 사용할 때의 형태가 보입니다.
"Hello".getLonggerString("Hi")
↓
확장을 하려는 대상.확장 함수명(확장 함수 파라미터 타입)
↓
String.getLonggerString(String)
여기서는 확장을 하려는 대상, 즉 receiver type이 String이고 확장 함수명은 getLonggerString 그리고 파라미터 타입은 String입니다.
곧이곧대로 사용하면 재미없으니 이걸 약간 변형시켜 응용해볼까요?
fun main(args: Array<String>) {
println("Hello".getLonggerLength(3))
}
fun String.getLonggerLength(x: Int) : Int {
return if(this.length > x) this.length else x
}
5
이번엔 String인 Hello의 길이와 3을 비교하여 큰 수를 리턴 받습니다. 확장 함수의 리턴타입과 파라미터 타입을 변경한 것입니다. 그러면 파라미터 타입은 String으로 유지한 채 두 String 중 길이가 더 긴 String의 length를 리턴 받는 확장 함수도 만들 수 있겠죠? 또 파라미터 2개를 받아서 뭔가를 할 수도 있을 것입니다. 한 번 생각해보시면 좋을 것 같습니다.
중위 표기법 (Infix notation)
함수는 중위 표기법을 사용해서 호출될 수 있습니다. 이때 세 가지 조건이 있습니다.
1. 멤버 함수 또는 확장 함수여야 한다.
2. 하나의 파라미터를 가져야 한다.
3. infix 키워드를 사용해야 한다.
그럼 '두 String 중 길이가 더 긴 String의 length를 리턴 받는 확장 함수'를 이참에 한 번 만들어 보겠습니다.
fun main(args: Array<String>) {
println("Hello".getLonggerStringLength("Have a nice day!"))
}
fun String.getLonggerStringLength(x: String) : Int {