티스토리 뷰

코틀린에서도 대부분의 언어에서 지원하는 overloading을 지원한다.

이것은 같은 스코프 안에서 같은 이름의 함수 또는 메소드를 여러 개 만들 수 있는 기능인데, 이름이 같더라도 parameter의 이름이나 갯수가 다르다면 다른 함수 또는 메소드로 인식하게 된다. (Java와 같음) 다만 parameter의 갯수는 같으면서 자료형의 name이 다르면 overloading을 할 수는 없다.

fun main(args: Array<String>) {

    read(7)
    read("감사합니다.")

}

fun read(x: Int) {
    println("숫자 $x 입니다.")
}

fun read(x:String) {
    println(x)
}

---

// 숫자 7 입니다.
// 감사합니다

출력값을 보면 들어가는 자료형에 따라 출력값이 바뀌는 것을 알 수 있다. 중요한 것은 함수의 parameter값의 이름이 같아야 한다. 위 코드가 작동하는 이유는 parameter x로 고정되어 있기 때문이다.

그렇다면 이제 parameter를 받아야하는 함수지만, 별다른 parameter가 없더라도 기본값으로 작동해야 한다면 어떻게 해야 할까? 이때는 당연히 default agrument를 사용한다.

fun main(args: Array<String>) {

    deliveryItem("짬뽕") // 짬뽕 1개를 집에 전달하였습니다.
    deliveryItem("책", 3) // 책 3개를 집에 전달하였습니다.
    deliveryItem("노트북", 30, "학교") // 노트북 30개를 학교에 전달하였습니다.

}

fun deliveryItem(name: String, count: Int = 1, destination: String = "집") {
    println("${name} ${count}개를 ${destination}에 전달하였습니다.")
}

parameter가 채워진 경우에는 입력 받은 parameter가 출력되지만 그렇지 않은 경우 default값으로 출력되는 것을 알 수 있다. 근데 만약에 count: Int = 1이건 변경하고 싶지 않다면 어떻게해야 할까? 그냥 parameter 이름을 사용하면된다. 순서 상관없이 가능하다. 아래와 같이 코드를 작성하면 된다.

fun main(args: Array<String>) {

    deliveryItem("선물", destination = "친구집") // 선물 1개를 친구집에 전달하였습니다.

}

fun deliveryItem(name: String, count: Int = 1, destination: String = "집") {
    println("${name} ${count}개를 ${destination}에 전달하였습니다.")
}

이번에는 같은 자료형을 개수에 상관없이 parameter로 받고 싶을 때 사용하는 variable number of arguments (vararg)를 사용해보자.

fun main(args: Array<String>) {

    sum(1, 2, 3, 4)

}

fun sum(vararg numbers: Int) {
    var sum = 0

    for (number in numbers) {
        sum += number
    }
    println(sum)
}

vararg은 개수가 정해지지 않은 parameter임으로 반드시 함수 parameter 중 맨 마지막에 사용해야 한다는 점을 잊지말자.

마지막으로 마치 연산자처럼 쓸 수 있는 infix 함수이다. 참고로 class 내부에서 infix 함수를 선엉할 때는 적용할 클래스가 자기 자신이므로 class 이름은 쓰지 않는다.

fun main(args: Array<String>) {

    println(6 multiply 4)
    // 6이 this에 해당하고
    // 4가 x에 해당함
    // 위와 같은 의미를 갖는 코드는 다음과 같음
    println(6.multiply(4))

}

infix fun Int.multiply(x: Int): Int = this * x