프로그래밍 언어/코틀린

[Kotlin] 22. 함수의 argument를 다루는 방법과 infix 함수

엔지니어 규 2022. 5. 31. 21:22
728x90

 

코틀린에서도 대부분의 언어에서 지원하는 함수의 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 함수를 선언 할 때 적용할 클래스가 자기 자신이므로 클래스의 이름은 쓰지 않는다.

 

 

728x90