[Kotlin] 22. 함수의 argument를 다루는 방법과 infix 함수
코틀린에서도 대부분의 언어에서 지원하는 함수의 overloading이 지원된다.
이것은 같은 scope 안에서 같은 이름의 함수를 여러개 만들 수 있는 기능이다.
이름이 같더라도 파라미터의 자료형이 다르거나, 파라미터의 갯수가 다르다면 서로 다른 함수로 동작할 수 있습니다.
다만 패러미터의 이름만 다르게 묶고 자료형과 갯수가 동일하다면 오버로딩을 할 수 없다. 위와 같은 경우는 동작이 안된다.
fun main(){
read(7) //숫자 7입니다.
read("감사합니다.") //감사합니다.
}
fun read(x: Int){
println("숫자 ${x}입니다.")
}
fun read(x: String){
println(x)
}
위 코드를 실행해보면 함수이름은 같지만 자료형을 구분하여 함수가 매칭되어 실행되는 것을 볼 수 있다.
default argument, named argument
패러미터를 받아야 하는 함수이지만, 별다른 패러미터가 없더라도 기본값으로 동작해야 한다면 default argument 를 사용한다.
fun main(){
deliveryItem("짬뽕") // 짬뽕,1,개를 집에 배달했습니다.
deliveryItem("책",3) // 책,3,개를 집에 배달했습니다.
deliveryItem("노트북",30,"학교") // 노트북,30,개를 학교에 배달했습니다.
deliveryItem("선물", destination = "친구집") // 선물,1,개를 친구집에 배달했습니다.
/*
deliveryItem("선물", ,"친구집") 에서 중간을 비우면 동작하지 않는다.
* */
}
fun deliveryItem(name: String, count : Int =1, destination : String ="집"){
println("${name},${count},개를 ${destination}에 배달했습니다.")
}
위의 코드처럼 count : Int =1, destination : String = "집" 으로 default argument를 설정하면 함수에서 패러미터를 받지 않아도,
기본값으로 동작한다.
하지만 delliveryItem("선물", , "친구집") 처럼 중간에 파라미터를 비워두면 함수는 동작하지않는다.
이런 상황에서 deliveryItem("선물", destination = "친구집") 에서처럼 named argument 를 사용 하면
중간에 count 파러미터를 비워도 함수가 동작한다.
named argument 는 패러미터의 순서와 상관없이 패러미터의 이름을 사용하여 직접 패러미터에 값을 할당하는 기능이다.
varrarg
같은 자료형을 개수에 상관없이 패러미터를 받고싶을때는 variable number of arguments (vararg)를 사용한다.
fun main(){
sum(1,2,3,4) //10
}
fun sum(vararg numbers : Int){
var sum = 0
for (n in numbers){
sum += n
}
println(sum)
}
vararg 는 개수가 지정되지 않은 패러미터라는 특징이 있으므로, 다른 패러미터와 사용할때는 반드시 맨마지막에 사용해야 한다.
ex : fun sample(text : String, name: String, age : Int, vararg x : Int)
infix function
마치 연산자처럼 쓸 수 있는 infix function을 알아보자.
fun main(){
println(6 multiply 4) //4
println(6.multiply(4)) //4
}
infix fun Int.multiply(x: Int): Int = this * x
infix 함수를 사용하기 위해선 , 함수 이름을 infix 함수가 적용될 자료형.이름 으로 지정한다.
여기서 int 는 int 값에 적용할 multiply 함수를 만들었고 파라미터로 int 값 x를 지정하고, 반환값 역시 Int 이다.
그리고 this 와 x를 곱해서 반환한다.
println(6 multiply 4) 에서 좌측의 6이 infix 함수가 적용되는 객체 자신인 this 에 해당하고, 우측의 4가 패러미터 x 이다.
6.multyply(4) 를 써도 동일하게 동작한다.
class 안에서 infix 함수를 선언 할 때 적용할 클래스가 자기 자신이므로 클래스의 이름은 쓰지 않는다.